變量:基本類型值和引用類型值太示。
二者不同:1.動(dòng)態(tài)的屬性:引用類型可以添加屬性和方法柠贤,基本類型不可;
2.復(fù)制變量值:復(fù)制變量值時(shí)类缤,基本類型值會(huì)在變量對(duì)象上創(chuàng)建新值臼勉,并把該值復(fù)制到為新變量分配的位置。引用類型也會(huì)創(chuàng)建新值餐弱,不過該值是一個(gè)指針宴霸,指向存儲(chǔ)在堆內(nèi)存中的對(duì)象。
3.傳遞參數(shù):在為函數(shù)傳遞參數(shù)時(shí)膏蚓,不會(huì)影響原始的基本類型值瓢谢,但是會(huì)影響引用類型值(傳遞參數(shù)時(shí),對(duì)于基本類型值驮瞧,會(huì)將其值復(fù)制給一個(gè)局部變量氓扛;對(duì)于引用類型值,會(huì)將其地址復(fù)制給一個(gè)局部變量)论笔。
function test1(num){
num=num+1;
return num;
}
var res=1;
varresult=test1(res);//res=1;result=2;
function setname(obj){
obj.name="gly";
}
var obj1=new Object();
var obj2=setname(obj1);//obj1.name="gly"
4.檢測(cè)類型:檢測(cè)基本數(shù)據(jù)類型時(shí)用typeof,但是檢測(cè)引用類型時(shí)采郎,需要用instanceof千所。(typeof只能檢測(cè)是否時(shí)引用類型,但不能檢測(cè)是哪種具體的引用類型)
var arr=[1,2,3];
var b=3;
console.log(typeof arr);//object
console.log(b instanceof Object);//true
console.log(arr instanceof Array);//true
執(zhí)行環(huán)境及作用域
執(zhí)行環(huán)境定義了函數(shù)或變量有權(quán)訪問的其他數(shù)據(jù)蒜埋,決定各自的行為淫痰。
每個(gè)執(zhí)行環(huán)境都有相對(duì)應(yīng)的對(duì)象,并且對(duì)象中包括變量和函數(shù)理茎。
每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境黑界。
當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),創(chuàng)建變量對(duì)象的一個(gè)作用域鏈:以保證對(duì)執(zhí)行環(huán)境中的變量和函數(shù)的有序訪問皂林。
作用域鏈的前端是當(dāng)前環(huán)境的變量和函數(shù)朗鸠,依次外擴(kuò),最后面是全局環(huán)境中的變量和函數(shù)础倍。
標(biāo)識(shí)符解析:從作用域鏈前端開始依次向后尋找標(biāo)識(shí)符烛占。
1.1延長(zhǎng)作用域鏈:在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象
方法:1. try-catch語句的catch塊;
2. with語句沟启;
1.2沒有塊級(jí)作用域忆家。
塊級(jí)作用域:任何一對(duì){}中的語句集都屬于一個(gè)塊,塊內(nèi)變量不能在塊外調(diào)用德迹。
但是js有函數(shù)作用域芽卿,因此可以用函數(shù)實(shí)現(xiàn)塊級(jí)作用域。
for(var i=0;i<10;i++){
}
console.log(i);//10
function test(){
var j;
for(j=0;j<10;j++){
}
}
console.log(j);//j is not defined
垃圾收集
JS具有自動(dòng)垃圾收集機(jī)制胳搞。(執(zhí)行環(huán)境負(fù)責(zé)管理代碼執(zhí)行時(shí)的內(nèi)存)
垃圾回收策略:
標(biāo)記清除(最常見):變量進(jìn)入環(huán)境卸例,將變量標(biāo)記為“進(jìn)入環(huán)境”,離開環(huán)境時(shí)肌毅,標(biāo)記“離開”筷转,最后垃圾回收器會(huì)把標(biāo)記有離開的變量回收內(nèi)存。
引用計(jì)數(shù)(不常見):聲明一個(gè)變量并將其賦值引用類型值悬而,引用計(jì)數(shù)為1呜舒,再將這個(gè)值復(fù)制給另一個(gè)變量,加1笨奠,當(dāng)變量值更改時(shí)袭蝗,減1,當(dāng)為0時(shí)般婆,收回內(nèi)存呻袭。跟蹤記錄每個(gè)值被引用的次數(shù),但會(huì)導(dǎo)致循環(huán)引用問題(兩個(gè)變量互相引用腺兴,永不為1)左电。
解除引用:將變量值賦值為null,以使其脫離執(zhí)行環(huán)境。可以消除循環(huán)引用現(xiàn)象篓足,并且對(duì)垃圾收集也有好處段誊。主要應(yīng)用于全局對(duì)象及屬性和循環(huán)引用變量的引用。
解除引用:將變量值賦值為null,以使其脫離執(zhí)行環(huán)境栈拖×幔可以消除循環(huán)引用現(xiàn)象,并且對(duì)垃圾收集也有好處涩哟。主要應(yīng)用于全局對(duì)象及屬性和循環(huán)引用變量的引用索赏。