javascript - 即使删除原始属性后,通过引用复制到第二个属性的对象仍然存在?

标签 javascript pass-by-reference

我认为对象是作为引用传递的。但是当我删除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 中的错误吗?

编辑: 感谢大家的回复!所以这不是一个错误,而且这种行为实际上非常好,它允许人们在保留对象的同时更改“键”/“属性”名称! :)

最佳答案

...我参加聚会迟到了吗?这是我的解释(也请阅读其他答案,这只是为了用视觉表示来支持这些答案):

  1. 空对象的初始化 a与另一个对象( value:true )。

enter image description here

  • 分配空对象 a有属性(property)b引用另一个对象 ( value:true )。
  • enter image description here

  • 分配对象 a有属性(property)c 引用同一个对象 ( value:true )。
  • enter image description here

  • 删除 b ,因此a.b不再引用子对象 ( value:true )。
  • enter image description here

  • 主要对象的最终表示 a .
  • enter image description here

    因此我们可以通过视觉表示轻松地看到子对象是如何被保留的:)

    关于javascript - 即使删除原始属性后,通过引用复制到第二个属性的对象仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26583696/

    相关文章:

    c++ - C++ 中的指针和引用

    Java 对象赋值

    c++ - 通过引用传递给构造函数

    javascript - Angular 路由失败 - 模态弹出窗口

    javascript - Vue Simple Table强制每个单元2或3列

    javascript - 如何在 NodeJS 中制作一个简单的网络爬虫?

    c++ - 传递 std::ifstream 以用作指针

    java - SWIG - Java - 通过引用传递 int

    javascript - jQuery Flot xaxis 时间格式

    javascript - 响应中的对象对象错误 javascript