一檬某、棧(stack)和堆(heap)
stack 為自動(dòng)分配的內(nèi)存空間抑钟,它由系統(tǒng)自動(dòng)釋放袍睡;heap 則是動(dòng)態(tài)分配的內(nèi)存沪蓬,大小也不一定會(huì)自動(dòng)釋放。
二羞秤、數(shù)據(jù)類型
JS分為兩種數(shù)據(jù)類型:
基本數(shù)據(jù)類型:Number缸托、String、Boolean瘾蛋、Null俐镐、Unfefined、Symbol(ES6)哺哼,這些類型可以直接操作保存在變量中的實(shí)際值佩抹。
引用數(shù)據(jù)類型:Object(在JS中除了基本數(shù)據(jù)類型以外的都是對(duì)象,數(shù)據(jù)是對(duì)象取董,函數(shù)是對(duì)象棍苹,正則表達(dá)式是對(duì)象)。
三茵汰、基本數(shù)據(jù)類型(存放在棧中)
基本數(shù)據(jù)類型是指存放在棧中的簡(jiǎn)單數(shù)據(jù)段枢里,數(shù)據(jù)大小確定,內(nèi)存空間大小可以分配蹂午,他們是直接按值存放的栏豺,所以可以直接按值訪問。
var a = 10;
var b = a;
b = 20;
console.log(a);? ? // 10
console.log(b);? ? // 20
下圖演示了這種基本數(shù)據(jù)類型賦值的過程:
四豆胸、引用數(shù)據(jù)類型(存放在堆中的對(duì)象奥洼,每個(gè)空間大小不一樣,要根據(jù)情況進(jìn)行特定的配置)
引用類型是存放在堆內(nèi)存中的對(duì)象配乱,變量其實(shí)是保存的在棧內(nèi)存中的一個(gè)指針(保存的是堆內(nèi)存中的一個(gè)引用地址)溉卓,這個(gè)指針指向堆內(nèi)存皮迟。
引用類型數(shù)據(jù)在棧內(nèi)存中保存的實(shí)際上是對(duì)象在堆內(nèi)存中的引用地址,通過這個(gè)引用地址可以快速查找到保存中堆內(nèi)存中的對(duì)象桑寨。
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "123";
console.log(obj1.name);? ? // 123
說明這兩個(gè)引用數(shù)據(jù)類型指向了同一個(gè)堆內(nèi)存對(duì)象伏尼。obj1賦值給obj2,實(shí)際上這個(gè)堆內(nèi)存對(duì)象在棧內(nèi)存的引用地址復(fù)制了一份給了obj2尉尾,但是實(shí)際上他們共同指向了同一個(gè)堆內(nèi)存對(duì)象爆阶,所以修改obj2其實(shí)就是修改那個(gè)對(duì)象,所以通過obj1訪問也能訪問的到沙咏。
這里設(shè)計(jì)深拷貝與淺拷貝:http://www.reibang.com/p/5e6bc63c4afc