基本類(lèi)型的值源自以下 5種基本數(shù)據(jù)類(lèi)型:Undefined斤葱、Null赫蛇、Boolean召廷、Number 和 String凳厢。還有 1種復(fù)雜數(shù)據(jù)類(lèi)型(引用類(lèi)型)——Object,Object 本質(zhì)上是由一組無(wú)序的名值對(duì)組成的竞慢。
基本類(lèi)型的數(shù)據(jù)是存放在棧內(nèi)存中的先紫,而引用類(lèi)型的數(shù)據(jù)是存放在堆內(nèi)存中的
值類(lèi)型:數(shù)值、布爾值筹煮、null遮精、undefined。
基本類(lèi)型的復(fù)制就是在棧內(nèi)存中開(kāi)辟出了一個(gè)新的存儲(chǔ)區(qū)域用來(lái)存儲(chǔ)新的變量败潦,這個(gè)變量有它自己的值,如果其中一個(gè)的值改變本冲,則不會(huì)影響到另一個(gè)准脂。任何方法都無(wú)法改變一個(gè)基本類(lèi)型的值,除非對(duì)此變量重新賦值。
引用類(lèi)型:對(duì)象眼俊、數(shù)組意狠、函數(shù)粟关。
當(dāng)從一個(gè)變量向另一個(gè)變量賦值引用類(lèi)型的值時(shí)疮胖,同樣也會(huì)將存儲(chǔ)在變量中的對(duì)象的值復(fù)制一份放到為新變量分配的空間中。前面講引用類(lèi)型的時(shí)候提到闷板,
保存在變量中的是對(duì)象在堆內(nèi)存中的地址澎灸,所以,與簡(jiǎn)單賦值不同遮晚,這個(gè)值的副本實(shí)際上是一個(gè)指針性昭,而這個(gè)指針指向存儲(chǔ)在堆內(nèi)存的一個(gè)對(duì)象。那么賦值操作后县遣,
兩個(gè)變量都保存了同一個(gè)對(duì)象地址糜颠,則這兩個(gè)變量指向了同一個(gè)對(duì)象。因此萧求,改變其中任何一個(gè)變量其兴,都會(huì)相互影響
基本類(lèi)型值和引用類(lèi)型值具有以下特點(diǎn):
? 基本類(lèi)型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中夸政;
? 從一個(gè)變量向另一個(gè)變量復(fù)制基本類(lèi)型的值元旬,會(huì)創(chuàng)建這個(gè)值的一個(gè)副本;
? 引用類(lèi)型的值是對(duì)象守问,保存在堆內(nèi)存中匀归;
? 包含引用類(lèi)型值的變量實(shí)際上包含的并不是對(duì)象本身,而是一個(gè)指向該對(duì)象的指針耗帕;
? 從一個(gè)變量向另一個(gè)變量復(fù)制引用類(lèi)型的值穆端,復(fù)制的其實(shí)是指針,因此兩個(gè)變量最終都指向同
一個(gè)對(duì)象仿便;
? 確定一個(gè)值是哪種基本類(lèi)型可以使用 typeof 操作符体啰,而確定一個(gè)值是哪種引用類(lèi)型可以使用
instanceof 操作符。
所有變量(包括基本類(lèi)型和引用類(lèi)型)都存在于一個(gè)執(zhí)行環(huán)境(也稱(chēng)為作用域)當(dāng)中探越,這個(gè)執(zhí)
行環(huán)境決定了變量的生命周期狡赐,以及哪一部分代碼可以訪問(wèn)其中的變量。以下是關(guān)于執(zhí)行環(huán)境的幾
點(diǎn)總結(jié):
? 執(zhí)行環(huán)境有全局執(zhí)行環(huán)境(也稱(chēng)為全局環(huán)境)和函數(shù)執(zhí)行環(huán)境之分钦幔;
? 每次進(jìn)入一個(gè)新執(zhí)行環(huán)境枕屉,都會(huì)創(chuàng)建一個(gè)用于搜索變量和函數(shù)的作用域鏈;
? 函數(shù)的局部環(huán)境不僅有權(quán)訪問(wèn)函數(shù)作用域中的變量鲤氢,而且有權(quán)訪問(wèn)其包含(父)環(huán)境搀擂,乃至全
局環(huán)境西潘;
? 全局環(huán)境只能訪問(wèn)在全局環(huán)境中定義的變量和函數(shù),而不能直接訪問(wèn)局部環(huán)境中的任何數(shù)據(jù)哨颂;
? 變量的執(zhí)行環(huán)境有助于確定應(yīng)該何時(shí)釋放內(nèi)存喷市。
JavaScript 是一門(mén)具有自動(dòng)垃圾收集機(jī)制的編程語(yǔ)言,開(kāi)發(fā)人員不必關(guān)心內(nèi)存分配和回收問(wèn)題威恼∑沸眨可
以對(duì) JavaScript 的垃圾收集例程作如下總結(jié)。
? 離開(kāi)作用域的值將被自動(dòng)標(biāo)記為可以回收箫措,因此將在垃圾收集期間被刪除腹备。
? “標(biāo)記清除”是目前主流的垃圾收集算法,這種算法的思想是給當(dāng)前不使用的值加上標(biāo)記斤蔓,然
后再回收其內(nèi)存植酥。
? 另一種垃圾收集算法是“引用計(jì)數(shù)”,這種算法的思想是跟蹤記錄所有值被引用的次數(shù)弦牡。JavaScript
引擎目前都不再使用這種算法友驮;但在 IE 中訪問(wèn)非原生 JavaScript 對(duì)象(如 DOM 元素)時(shí),這種
算法仍然可能會(huì)導(dǎo)致問(wèn)題驾锰。
? 當(dāng)代碼中存在循環(huán)引用現(xiàn)象時(shí)卸留,“引用計(jì)數(shù)”算法就會(huì)導(dǎo)致問(wèn)題。
? 解除變量的引用不僅有助于消除循環(huán)引用現(xiàn)象稻据,而且對(duì)垃圾收集也有好處艾猜。為了確保有效地回
收內(nèi)存,應(yīng)該及時(shí)解除不再使用的全局對(duì)象捻悯、全局對(duì)象屬性以及循環(huán)引用變量的引用匆赃。