1 基本類型和引用類型的值(注意“值”)
ES 變量包含的值就兩種,基本類型和引用類型,沒有第三種
1.1 動態(tài)屬性
其實呢,就是說“親兒子”引用類型的值可以添加或者修改或者刪除屬性和方法,而“路上撿的”基本數(shù)據(jù)類型就不可以
1.2 復制變量值
親兒子引用類型畢竟親,復制變量相當于復制一個指針,指向同一個對象,變量其中一個,改了親兒子們都會改變
撿的就不一樣了,復制就會復制一個新的值
1.3 傳遞參數(shù)
- ES 中所有函數(shù)的參數(shù)傳值都是按值傳遞的
- 基本類型的值在作為參數(shù)傳遞時會復制給一個局部變量
- 引用類型是復制這個值在內(nèi)存中的地址,在函數(shù)內(nèi)部修改會反映到外部,巴特!重寫對象的時候不會改變原來的值。
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 檢測類型
基本類型->typeof
引用類型->instanceof 判斷什么類型的對象
2 執(zhí)行環(huán)境和作用域
執(zhí)行環(huán)境
- 定義變量或者函數(shù)有權訪問的其他數(shù)據(jù)有那些
- 執(zhí)行環(huán)境關聯(lián)一個 變量對象,當前環(huán)境中所有的變量和函數(shù)都保存在這個對象中
- 全局執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境,宿主不同,全局環(huán)境也不同。web瀏覽器中,window對象為全局環(huán)境
- 當代碼執(zhí)行完畢時,環(huán)境被銷毀,包括所有的變量和函數(shù)
- 全局環(huán)境要到應用程序退出,(關閉網(wǎng)頁瀏覽器等等啦)
- 每個函數(shù)都有自己的執(zhí)行環(huán)境,執(zhí)行到該函數(shù)時,函數(shù)的環(huán)境會被推入一個環(huán)境棧中,執(zhí)行完就踢出去,控制權再還給之前的執(zhí)行環(huán)境
作用域鏈
簡單點說,作用域鏈就是代碼運行時一級一級的深入方法內(nèi)部,函數(shù)或者方法有訪問外部環(huán)境變量的權限
2.1 延長作用域鏈
意思是在作用域的前端臨時增加一個變量對象,執(zhí)行完后被移除,包括如下兩種方式
- try-catch 語句的catch塊
- with語句 并不推薦使用
2.2 沒有塊級作用域
對于在for,if的語句中定義的變量外部仍然可以訪問
聲明變量:使用var聲明變量后,變量會自動添加到最接近的環(huán)境中,函數(shù)內(nèi)部的話就是局部環(huán)境,而沒有使用var聲明的變量會自動添加到全局環(huán)境中。
查詢變量:從局部環(huán)境層層往上查(也就是從作用域鏈的頭部開始),遇到定義就停止。(對性能沒有影響)
3 垃圾收集
- 標記清除
- 引用計數(shù)
js做的挺好,不需要手動來做,標記清除是指首先給在內(nèi)存中所有變量加上標記,再去掉正在用的和用過的變量的標記,離開變量是則比較為離開,則清除。引用計數(shù)會導致循環(huán)引用,從而導致性能問題
-管理內(nèi)存: 占用比較大的全局變量和全局對象的屬性,在使用完后可以設置為null,即為解除變量