Javascript:为什么对象分配中的'='运算符会创建对现有对象的引用?

时间:2018-08-20 22:37:55

标签: javascript reference javascript-objects

我正在做以下事情:

let obj = {
    a: 'Hi',
}

let copy = obj;
copy.a = 3;

console.log(obj.a);

令我惊讶的是,obj.a的值也是3。有谁知道为什么会这样以及如何解决?

2 个答案:

答案 0 :(得分:1)

原始类型作为值传递,例如Booelan,String,Numbers。

对象类型作为参考传递,例如数组,函数和对象

您可以使用Object.assign(),它在文档中指出: Object.assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

let obj = {
    a: 'Hi',
}

let copy = Object.assign({},obj);
copy.a = 3;

console.log(obj.a);

因此在我们的示例中,{}是我们的目标(一个空对象),我们的源是obj变量。

答案 1 :(得分:1)

将对象类型分配给变量时,实际上是在存储称为指针的内容。 指针只是系统内存中用于存储对象数据的地址。

在您的示例中

let obj = { a: 'Hi' } // obj is now pointing to a reference, say, 0x1a, in memory

现在,当您这样做

let copy = obj // copy is now pointing to the same location in memory, that is, 0x1a

实质上,copyobj不是对象中的数据,而是它们的地址。对象本身是驻留在存储器位置0x1a中的一些数据blob。在objcopy上添加/删除/编辑属性,除了修改驻留在0x1a上的数据外,没有任何其他作用。