我认为对象是作为引用传递的。但是当我删除b
时,它仍然存在于c
中。请看这个例子:
第一部分对我来说很有意义,因为它是通过引用传递的:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = 'rawr';
console.log(uneval(a)); // outputs: "({b:{val:"rawr"}, c:{val:"rawr"}})"
现在这部分对我来说没有意义:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = 'rawr';
delete a.b;
console.log(uneval(a)); // outputs: "({c:{val:"rawr"}})"
因此b
属性被删除,但c
属性将属性保存为删除之前引用的属性。这是 JavaScript 中的错误吗?
编辑: 感谢大家的回复!所以这不是一个错误,而且这种行为实际上非常好,它允许人们在保留对象的同时更改“键”/“属性”名称! :)
最佳答案
...我参加聚会迟到了吗?这是我的解释(也请阅读其他答案,这只是为了用视觉表示来支持这些答案):
- 空对象的初始化
a
与另一个对象(value:true
)。
- 分配空对象
a
有属性(property)b
引用另一个对象 (value:true
)。
- 分配对象
a
有属性(property)c
引用同一个对象 (value:true
)。
- 删除键
b
,因此a.b
不再引用子对象 (value:true
)。
- 主要对象的最终表示
a
.
因此我们可以通过视觉表示轻松地看到子对象是如何被保留的:)
关于javascript - 即使删除原始属性后,通过引用复制到第二个属性的对象仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26583696/