【问题标题】:JavaScript: Nullifying a variable that points to an object nullifies the variable not the object?JavaScript:使指向对象的变量无效会使变量而不是对象无效?
【发布时间】:2016-06-22 21:41:42
【问题描述】:

基本上,我有一个 大量 嵌套对象,因此我创建变量来访问该对象,因此我不必编写整个嵌套对象来执行操作。

问题是,当我创建一个变量并通过将其设置为 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

【问题讨论】:

  • 因为您正在重新分配变量......而不是对象值。这是预期的行为。重新分配变量时会中断对对象的引用。与var a=1, b=a, a=2; alert(b)// is still 1 没有什么不同
  • 但为什么 column.a ="purple" 有效但 column = 'purple' 无效?
  • 因为您正在更改 column 引用的对象中的属性值...而不是重新分配整个变量 column
  • 所以你改变的是变量指向的东西,而不是它指向的变量。
  • 脑洞大开。如果你把你的 cmets 作为答案,你会得到一些代表 ;-)

标签: javascript variables javascript-objects


【解决方案1】:

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

本质上归结为:

  1. 在 Javascript 中设置变量会将其指向一个新的“值”(原始对象)。这就是为什么将column 无效或设置为“紫色”不会改变底层对象。它只是将column 指向别的东西。

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

【讨论】:

  • 哇哇是的。评估策略正是我想要的。
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2023-03-22
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多