原始數據類型(Undefined,Null,Boolean,Number、String)
存儲位置:棧
傳值方式:按值傳遞
引用數據類型(對象、數組、函數)
存儲位置:堆
引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址,當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址後,從堆中獲得實體。
var obj = {x : 0};
obj.x = 100;
var o = obj; //實際拷貝的是obj的內存地址
o.x = 1;
console.log(obj.x) // 1, obj被修改
o = {x:100}; //等同於重新開闢內存,不是修改
console.log(obj,o) //{x:1} {x:100}
引用類型的值是同時保存在棧內存和堆內存中的對象
javascript不允許直接訪問內存中的位置,也就是說不能直接操作對象的內存空間,那我們操作啥呢? 實際上,是操作對象的引用,
所以引用類型的值是按引用訪問的。
準確地說,引用類型的存儲需要內存的棧區和堆區(堆區是指內存裏的堆內存)共同完成,棧區內存保存變量標識符和指向堆內存中該對象的指針,也可以說是該對象在堆內存的地址。