原始数据类型(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不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,那我们操作啥呢? 实际上,是操作对象的引用,
所以引用类型的值是按引用访问的。
准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。