ES变量分基本类型和引用类型
基本类型:简单的数据段,即Undefined、Null、Boolean、Number、String和Symbol
引用类型:可能由多个值构成的对象,即Object
基本类型的值是直接存储在栈里面的,而引用类型的值是存储在堆里面。
由于js不允许直接操作对象的内存空间,所以在操作对象时,实际上是在操作对象的引用而不是实际的对象。
举个例子,该代码的存储格式如下图所示
var x = 2;
var obj = new Object()
当复制变量时,如下
var x = 2;
var x1 = x;
var obj = new Object()
var obj1 = obj
从复制后的内存图可以看出x和x1没关系,即x1改变值不会影响到x
而obj和obj1指向的是同一个对象,所以obj1更改对象的值时,obj也会随之改变
var x = '我是x';
var x1 = x; //复制x
x1 = '我是x1'
console.log(x) //我是x(x1改了值,但没有影响到x)
console.log(x1) //我是x1
var obj = new Object()
obj.name = '我是obj'
var obj1 = obj //复制obj给obj1
obj1.name = '我是obj1'
console.log(obj) //我是obj1(obj1改了值,影响到了obj)
console.log(obj1) //我是obj1
总结:
- 基本类型值在内存中占据固定大小的空间,因此会被保存在栈内存中
- 从一个变量向另一个变量复制基本类型的值,会创建这个值的副本
- 引用类型的值是对象,保存在堆内存中
- 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
- 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都会指向同一个对象
以上内容参考自《JavaScript高级程序设计(第3版)》