基本数据类型
变量都是保存在栈内存中,基本数据类型的值直接在栈内存中存储。相互不影响。
var a = 123;
var b = a;
a++; // b的值不变
栈内存中:
变量 | 值 |
---|---|
b | 123 |
a | 123 |
引用数据类型
对象保存在堆内存中
var obj = new Object();
obj.name = "墨祈";
var obj2 = obj;
obj.name = "MoQi"; // obj和obj2的名字都被改了
栈内存:
变量 | 值 |
---|---|
obj2 | 0x123 |
obj | 0x123 |
堆内存:
当new出现时,在堆内存中拿出一块空间给new的这个东西,假如这个空间的地址是 0x123。
每创建一个新对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用)
当执行 obj.name = "墨祈";
时,在堆内存开辟出的空间中添加一条 name = "墨祈";
当执行var obj2 = obj;
时,在栈内存中添加obj2, 0x123
当修改属性时,因为两个变量保存的是同一个对象(同一块内存),他们的值同时改变。
若obj2 = null
, 则链接断开,obj2和obj不再指向同一个对象。
对象的比较
当比较两个引用数据类型时,比较的是内存地址。
var obj3 = new Object();
var obj4 = new Object();
console.log(obj3==obj4); // false
两个对象,所有值都一样,也不相等。因为不指向同一个地址。
上述obj == obj2为true, 因为指向同一个地址。