对象的两种修改方式
假设现在有两个变量指向同一个对象:
let obj = { a: 123 };
let obj2 = obj;
由于obj2是对obj对象的浅拷贝,所以此时修改obj对象的属性值和修改整个obj对象的结果是不一样的,例如:
// 情况1:
obj.a = 'abc';
console.log(obj2); // 输出 { a: "abc" };
// 情况2:
obj = { a: 'abc' };
console.log(obj2); // 输出 { a: 123 }
这是因为原本obj和obj2指向同一块内存空间。对于情况1,只是修改了这个内存空间的内容,而obj和obj2依然都指向这个空间,因此obj2.a输出的也是修改后的内容。对于情况2,直接修改obj对象,相当于在内存中开辟了一个新的内存空间并让obj指向它,则obj和obj2不再指向同一块内存,所以obj2.a输出的依然是旧的值;这种情况下,可以看作是新声明的一个obj变量覆盖了原来的obj,这时的obj和obj2已经没有任何关系了。