本质上,我有一个大量嵌套对象,因此我创建变量来访问该对象,这样我就不必编写整个嵌套对象来执行操作。
问题是,当我创建一个变量并通过将其设置为 null 来操作它时,该变量被设置为 null,但它引用的对象却没有。
从概念上讲,我有点明白发生了什么,但如果这就是发生的事情,那么我对 javascript 的基本属性已经错误了大约 4 年......这很好,错误就是增长的发生方式,但仍然如此。
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.
谁能告诉我为什么会发生这种情况,并为我提供一个引用资料,让我可以阅读更多有关为什么会发生这种情况的信息?
<小时/> <小时/>值得注意的是,如果您尝试设置某些内容而不是取消某些内容,则该更改将持续存在。有点儿。不要将上面的设置设置为 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
本质上可以归结为:
在 Javascript 中设置一个变量会将其指向一个新的“值”(原始对象)。这就是为什么将
column
设置为“紫色”或无效不会更改底层对象。它只是将column
指向其他内容。但是,设置
column.a
确实有效,因为列指向与嵌套列相同的对象,因此在其中一个上设置属性会反射(reflect)在另一个上。
关于JavaScript:取消指向对象的变量会取消变量而不是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37978765/