【发布时间】: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