1、垃圾回收機制
?內(nèi)存中的生命周期
? ? ? ? 1、內(nèi)存分配
? ? ? ? 2、內(nèi)存使用(讀寫)
? ? ? ? 3、內(nèi)存回收,使用完畢之后,垃圾回收器完成
? ? ? ? 內(nèi)存泄漏:該回收的,由于某些未知因素,未釋放,叫做內(nèi)存泄漏
棧:數(shù)據(jù)存在其中會自動釋放
堆:對象,根據(jù)程序員的操作來決定釋放
一、引用計數(shù)法? ?
? ? ? 1、記錄引用次數(shù)
? ? ? 2、計數(shù) ++? 或者 --
? ? ? 3、引用次數(shù)為0時,釋放內(nèi)存
原理:跟蹤記錄每個值被引用的次數(shù)。
當垃圾收集器下一次運行時,它就會釋放引用次數(shù)是0的值所占的內(nèi)存。
如果一個對象已經(jīng)沒有指向他的引用了,那么就認為不在需要,
循環(huán)引用的內(nèi)存,無法被釋放?
let obj1={
uname:"lisi"
}
let a=obj1//存的是內(nèi)存地址,引用計數(shù)為2
a=null//--,引用計數(shù)為1
//缺點:占內(nèi)存消耗; 循環(huán)引用問題,內(nèi)存無法被釋放
看看這個
兩個對象被創(chuàng)建,并互相引用,形成了一個循環(huán)。
無法計數(shù)無法為0,他們的計數(shù)均為1,無法釋放,
計數(shù)算法考慮到它們互相都有至少一次引用,所以它們不會被回收。
let obj2={
a:obj3
}
let obj3={
b:obj2
}
obj2 = null
二、標記清除
? ? 垃圾回收器將定期從根開始,找所有從根開始引用的對象,然后找這些對象引用的對象……從根開始,垃圾回收器將找到所有可以獲得的對象和收集所有不能獲得的對象。
循環(huán)引用不再是問題了
在上面的示例中,函數(shù)調(diào)用返回之后,兩個對象從全局對象出發(fā)無法獲取。因此,他們將會被垃圾回收器回收。
2、閉包
在 JavaScript 中,閉包會隨著函數(shù)的創(chuàng)建而被同時創(chuàng)建。
內(nèi)層函數(shù)+外層函數(shù)的變量 與函數(shù),內(nèi)層函數(shù)使用了外層函數(shù)的變量
function outer() {
let i = 10
function inner() {
console.log(i)
}
return inner//外部函數(shù)調(diào)用內(nèi)部函數(shù)實現(xiàn)功能
}
let a = outer()
a()
a() //輸出兩次10
?外部可以訪問函數(shù)內(nèi)部的變量
閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。
下面這個函數(shù),他不是改變了全局變量,而是函數(shù)可以訪問全局變量并且利用表達式與打印,進行函數(shù)內(nèi)部的輸出表達,當出了這塊函數(shù),全局變量num還是0.
JavasSript 語言的特別之處就在于:函數(shù)內(nèi)部可以直接讀取全局變量,但是在函數(shù)外部無法讀取函數(shù)內(nèi)部的局部變量。
let num = 0
function test1() {
num++
console.log(`這是函數(shù)調(diào)用的第${num}次`)
}
test1()
test1()
num = 300
test1()
閉包函數(shù)?
一個函數(shù)的返回值是一個內(nèi)部函數(shù),并且這個內(nèi)部函數(shù)調(diào)用了父級函數(shù)的變量。
<script>
function outer() {
let num = 0
function inner() {
num++
console.log(`這是函數(shù)調(diào)用的第${num}次`)
}
return inner
}
let a = outer()
a()
a()
a()
num = 21
a()
</script>
3、Math對象
是一個內(nèi)置對象,它擁有一些數(shù)學常數(shù)屬性和數(shù)學函數(shù)方法。
來看看常用的數(shù)學成員,更多的成員可以上網(wǎng)查。
成員 | 作用 |
E | 歐拉常數(shù),也是自然對數(shù)的底數(shù),約等于?2.718 。 |
PI | 獲取圓周率,結(jié)果為3.141592653589793。 |
abs(x) | 返回一個數(shù)的絕對值。 |
sqrt(x) | 獲取x的平方根 |
cbrt(x) | 返回一個數(shù)的立方根。 |
max(x) | 返回零到多個數(shù)值中最大值。 |
min(x) | 返回零到多個數(shù)值中最小值。 |
pow(x,y) | 返回一個數(shù)的 y 次冪。 |
ceil(x) | 向上取整。 |
floor(x) | 向下取整。 |
round(x) | 返回四舍五入后的整數(shù)。 |
random | 返回一個 0 到 1 之間的偽隨機數(shù)。隨機數(shù)[0,1) |
log(x) | 返回一個數(shù)的自然對數(shù)(㏒e,即 ㏑)。 |
log2(x)/log(x) | 返回一個數(shù)以 2或者10 為底數(shù)的對數(shù)。 |
sign(x) | 返回一個數(shù)的符號,得知一個數(shù)是正數(shù)、負數(shù)還是 0 |
獲取n~m的隨機數(shù)
console.log(Math.floor(Math.random()*((n-m)+1))+m)
4、Date對象
創(chuàng)建Date對象,將返回一個字符串,以下是四種創(chuàng)建方法
let d1 = new Date();? ? ?//獲取當前時間
let d2= new Date(milliseconds); // 參數(shù)為毫秒
let d3 = new Date(dateString);
let d4 = new Date(year, month, day, hours, minutes, seconds, milliseconds);
milliseconds?參數(shù)是一個 Unix 時間戳,它是一個整數(shù)值,表示自 1970 年 1 月 1 日 00:00:00 UTC(the Unix epoch)以來的毫秒數(shù)。
dateString?參數(shù)表示日期的字符串值。
year, month, day, hours, minutes, seconds, milliseconds?分別表示年、月、日、時、分、秒、毫秒。
<script>
let today=new Date()
console.log('today='+today)
let d1 = new Date("October 13, 1975 11:13:00")
console.log('d1='+d1)
let d2=new Date("2022-2-17 23:03:46")
console.log('d2='+d2)
let d3=new Date(100000000000)
console.log('d3='+d3)
let d4=new Date(2018,8,19,6,26,21)
console.log('d4='+d4)
</script>
方法 | 描述 |
---|---|
getDate() | 從 Date 對象返回一個月中的某一天 (1 ~ 31)。 |
getDay() | 從 Date 對象返回一周中的某一天 (0 ~ 6)。 |
getFullYear() | 從 Date 對象以四位數(shù)字返回年份。 |
getHours() | 返回 Date 對象的小時 (0 ~ 23)。 |
getMinutes() | 返回 Date 對象的分鐘 (0 ~ 59)。 |
getMouth() | 從 Date 對象返回月份 (0 ~ 11)。 |
getSeconds() | 返回 Date 對象的秒數(shù) (0 ~ 59)。 |
getMilliseconds() |
返回 Date 對象的毫秒數(shù) (0 ~ 59)。 |
getTime() | 返回 1970 年 1 月 1 日至今的毫秒數(shù)(0~999。 |
parse() | 返回1970年1月1日午夜到指定日期(字符串)的毫秒數(shù)。 |
setDate() | 設(shè)置 Date 對象中月的某一天 (1 ~ 31)。 |
setFullYear() | 設(shè)置 Date 對象中的年份(四位數(shù)字)。 |
setHours() | 設(shè)置 Date 對象中的小時 (0 ~ 23)。 |
setMinutes() | 設(shè)置 Date 對象中的分鐘 (0 ~ 59)。 |
setMouth() | 設(shè)置 Date 對象中月份 (0 ~ 11)。 |
setSeconds() | 設(shè)置 Date 對象中的秒鐘 (0 ~ 59)。 |
setTime() | setTime() 方法以毫秒設(shè)置 Date 對象。 |
setYear() | 已廢棄。請使用 setFullYear() 方法代替。 |
toDateString() | 把 Date 對象的日期部分轉(zhuǎn)換為字符串。 |
toString() | 把 Date 對象轉(zhuǎn)換為字符串。 |
toTimeString() | 把 Date 對象的時間部分轉(zhuǎn)換為字符串。 |
UTC() | 根據(jù)世界時返回 1970 年 1 月 1 日 到指定日期的毫秒數(shù)。 |
舉個例子?
<script>
let date=new Date()
console.log(date+'')
let y=date.getFullYear()
console.log(y+'年')
let m=date.getMonth()
console.log(m+'月')
let day = date.getDate()
console.log(day+'號')
// 時分秒
let hh = date.getHours()
let mm = date.getMinutes()
let ss = date.getSeconds()
console.log(hh+'時')
console.log(mm+'分')
console.log(ss+'秒')
let w = date.getDay()
console.log('星期'+w)
console.log(date.toString()+' toString()')
console.log(date.toTimeString()+' toTimeString()')
console.log(date.toDateString()+' toDateString()')
</script>
?
??
5、展開運算符
關(guān)于數(shù)組內(nèi)全部元素的輸出,除了遍歷,還有沒有不遍歷的方法??
假如有一個數(shù)組,你要如何將其中的元素不遍歷也可以輸出?
let a=[3,2,11]
我想大家一般直接這樣:
?let c=a[0]
?let c1=a[1]
?let c2=a[2]
那么問題來了,要是,數(shù)組里的元素有上萬個呢,雖然有點夸張,但是,它不能被忽視對吧
哈哈,不裝了,介紹一下一個運算符,它是三個英文的句號
展開運算符:...
不僅是數(shù)組,還有字符串也可用
<script>
let a=[3,2,11]
//...展開運算符,可以把數(shù)組與對象展開
document.write(...a+'<br>')//將列表拆開
document.write(Math.max(...a))//不可以接數(shù)組與對象,可以是一串數(shù)字
</script>
?
6、獲取元素對象
在 HTML DOM 中,?元素對象代表著一個 HTML 元素。
方法 | |
document.getElementById() |
|
document.getElementsByClassName() |
返回文檔中所有指定類名的元素集合 |
document.getElementsByName() |
|
document.getElementsByTagName() |
返回指定標簽名的所有子元素集合。 |
?Document.querySelector("選擇器") |
拿到滿足第一個。 |
querySelectorAll(" ") |
拿到偽數(shù)組。文章來源:http://www.zghlxwxcb.cn/news/detail-852085.html |
<body>
<p>段落111</p>
<p>段落222</p>
<p>段落333</p>
<p>段落444</p>
<div>你是一個盒子111</div>
<div>你是一個盒子222</div>
<div>你是一個盒子333</div>
<ul>
<li>11111111小li</li>
<li name="k2">2222222小li</li>
<li class="f3">333333小li</li>
<li id="d4">4444444小li</li>
</ul>
<script>
let k2=document.getElementsByName("k2")
console.log(k2)
let f3=document.getElementsByClassName("f3")
console.log(f3)
let d4=document.getElementById("d4")
console.log(d4)
let d=document.getElementsByTagName("div")
let p1=document.querySelector("p")
console.log(p1)
let p2=document.querySelectorAll("p")
console.log(p2)
for (let i in p2) {
console.log(p2[i])
}
</script>
</body>
文章來源地址http://www.zghlxwxcb.cn/news/detail-852085.html
到了這里,關(guān)于Web前端 Javascript筆記3的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!