JavaScript: 使指向对象的变量无效会使变量而不是对象无效?

JavaScript: Nullifying a variable that points to an object nullifies the variable not the object?

本质上,我有一个 heavily 嵌套对象,所以我创建变量来访问该对象,这样我就不必为了执行操作而编写整个嵌套对象.

问题是当我创建一个变量并通过将其设置为 null 来操作它时,该变量被设置为 null,但它引用的对象却没有。

从概念上讲,我有点理解发生了什么,但如果这就是发生的事情,那么大约 4 年来我对 javascript 的基本 属性 是错误的......这很好,错误是成长的方式,但仍然如此。

var thing = { 
    content: { 
        area: { 
            row: { 
              column: {a: 'a', b:'b', c:'c'} 
            } 
        } 
    } 
} 

var contentArea = thing.content.area;
var row = contentArea.row
var column = row.column;

column = null;
console.log(row.column);
// logs  {a: "a", b: "b", c: "c"}
console.log(column);
// logs null
row.column = null;
console.log(row.column);
// logs null.

任何人都可以告诉我为什么会发生这种情况,并指出一个参考资料,我可以在其中阅读更多关于为什么会发生这种情况的信息吗?



值得注意的是,如果您尝试设置某些内容而不是取消某些内容,则该更改会持续存在。有点儿。不要将上面的设置为空,试试这个:

column.a = 'purple';
console.log(row.column);
console.log(column);
//both log {a: "purple", b: "b", c: "c"}

但是,如果您尝试将对象设置为其他内容,它不会持久保存到对象中:

column = 'purple'
console.log(row.column);
console.log(column);
// logs {a: "a", b: "b", c: "c"}
// 'purple

看这里:Evaluation Strategy - Call by Sharing 而这个 SO question

本质上归结为:

  1. 在 Javascript 中设置变量将其指向新的 'value'(原始对象)。这就是为什么取消 column 或将 'purple' 设置为 'purple' 不会更改基础对象的原因。它只是将 column 指向其他东西。

  2. 但是,设置 column.a 确实有效,因为列指向与嵌套列相同的对象,因此在一个上设置 属性 会影响另一个。