基本上,我有一个重度嵌套对象,所以我创建了变量来访问该对象,所以我不必编写整个嵌套对象来执行操作。
问题在于,当我创建一个变量并通过将其设置为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
答案 0 :(得分:1)
看看这里:Evaluation Strategy - Call by Sharing 这SO question
基本上归结为:
在Javascript中设置变量会将其指向一个新的'值' (原始对象)。这就是为什么将column
取消或设置为紫色'不会改变底层对象。它只是将column
指向其他内容。
但是,设置column.a
确实有效,因为列指向与嵌套列相同的对象,因此在一个对象上设置属性将反映在另一个上。