1 基本類型和引用類型的值(注意“值”)
ES 變量包含的值就兩種入蛆,基本類型和引用類型归敬,沒有第三種
1.1 動(dòng)態(tài)屬性
其實(shí)呢酷含,就是說“親兒子”引用類型的值可以添加或者修改或者刪除屬性和方法,而“路上撿的”基本數(shù)據(jù)類型就不可以
1.2 復(fù)制變量值
親兒子引用類型畢竟親汪茧,復(fù)制變量相當(dāng)于復(fù)制一個(gè)指針椅亚,指向同一個(gè)對(duì)象,變量其中一個(gè)舱污,改了親兒子們都會(huì)改變
撿的就不一樣了呀舔,復(fù)制就會(huì)復(fù)制一個(gè)新的值
1.3 傳遞參數(shù)
- ES 中所有函數(shù)的參數(shù)傳值都是按值傳遞的
- 基本類型的值在作為參數(shù)傳遞時(shí)會(huì)復(fù)制給一個(gè)局部變量
- 引用類型是復(fù)制這個(gè)值在內(nèi)存中的地址,在函數(shù)內(nèi)部修改會(huì)反映到外部扩灯,巴特媚赖!重寫對(duì)象的時(shí)候不會(huì)改變?cè)瓉淼闹怠?br>
function setname(obj){ obj.name="wu"; obj = new Object(); obj.name="li"; }; var person = new Object(); person.name="wu1"; setname(person); console.log(person.name);//wu
腦殘吧,這不就是按引用賦值么…
1.4 檢測(cè)類型
基本類型->typeof
引用類型->instanceof 判斷什么類型的對(duì)象
2 執(zhí)行環(huán)境和作用域
執(zhí)行環(huán)境
- 定義變量或者函數(shù)有權(quán)訪問的其他數(shù)據(jù)有那些
- 執(zhí)行環(huán)境關(guān)聯(lián)一個(gè) 變量對(duì)象珠插,當(dāng)前環(huán)境中所有的變量和函數(shù)都保存在這個(gè)對(duì)象中
- 全局執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境惧磺,宿主不同,全局環(huán)境也不同捻撑。web瀏覽器中豺妓,window對(duì)象為全局環(huán)境
- 當(dāng)代碼執(zhí)行完畢時(shí)惜互,環(huán)境被銷毀,包括所有的變量和函數(shù)
- 全局環(huán)境要到應(yīng)用程序退出琳拭,(關(guān)閉網(wǎng)頁瀏覽器等等啦)
- 每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境训堆,執(zhí)行到該函數(shù)時(shí),函數(shù)的環(huán)境會(huì)被推入一個(gè)環(huán)境棧中白嘁,執(zhí)行完就踢出去坑鱼,控制權(quán)再還給之前的執(zhí)行環(huán)境
作用域鏈
簡(jiǎn)單點(diǎn)說,作用域鏈就是代碼運(yùn)行時(shí)一級(jí)一級(jí)的深入方法內(nèi)部絮缅,函數(shù)或者方法有訪問外部環(huán)境變量的權(quán)限
2.1 延長作用域鏈
意思是在作用域的前端臨時(shí)增加一個(gè)變量對(duì)象鲁沥,執(zhí)行完后被移除,包括如下兩種方式
- try-catch 語句的catch塊
- with語句 并不推薦使用
2.2 沒有塊級(jí)作用域
對(duì)于在for耕魄,if的語句中定義的變量外部仍然可以訪問
聲明變量:使用var聲明變量后画恰,變量會(huì)自動(dòng)添加到最接近的環(huán)境中,函數(shù)內(nèi)部的話就是局部環(huán)境吸奴,而沒有使用var聲明的變量會(huì)自動(dòng)添加到全局環(huán)境中允扇。
查詢變量:從局部環(huán)境層層往上查(也就是從作用域鏈的頭部開始),遇到定義就停止则奥。(對(duì)性能沒有影響)
3 垃圾收集
- 標(biāo)記清除
- 引用計(jì)數(shù)
js做的挺好考润,不需要手動(dòng)來做,標(biāo)記清除是指首先給在內(nèi)存中所有變量加上標(biāo)記读处,再去掉正在用的和用過的變量的標(biāo)記糊治,離開變量是則比較為離開,則清除罚舱。引用計(jì)數(shù)會(huì)導(dǎo)致循環(huán)引用井辜,從而導(dǎo)致性能問題
-管理內(nèi)存: 占用比較大的全局變量和全局對(duì)象的屬性,在使用完后可以設(shè)置為null管闷,即為解除變量