我有以下代码。当我访问w [1] [0]时,我只希望更改该位置的对象。但是,所有对象都会改变。我假设这是因为在某种程度上,它们都指向同一个对象。我该如何解决这个问题?
heroku pg:push ReadingList_development DATABASE_URL --app calm-eyrie-9110
答案 0 :(得分:1)
在JavaScript中,对象通过引用传递,而不是通过值传递。这意味着如果将同一个对象传递给几个变量,它们都会指向内存中的相同位置。这就是你的init
对象在任何地方都被改变的原因。
要防止这种情况,您需要在将对象分配给变量之前克隆该对象。最简单的内置方法之一是使用JSON,如下所示:
var copy = JSON.parse(JSON.stringify(original));
所以在你的情况下就是这样:
x[i] = createArray(dim.slice(1), JSON.parse(JSON.stringify(init)));
答案 1 :(得分:0)
w[1][0].left = true;
此行正在更改 对象的唯一实例。看,这一行:
var w = createArray([2,2],{top: false,left: false});
是代码中唯一通过{}
字面值创建新对象(您感兴趣的类型)的行。所有其他设置操作(newVar = init
)仅复制对同一对象的引用。
这听起来很烦人,但它在代码中有很多好处。要修复它,您需要每次都创建一个副本,以替换最后一行createArray
var myCopy = {};
for (var key in origObject) {
if (origObject.hasOwnProperty(key)) {
myCopy[key] = origObject[key];
}
}
return myCopy;
警告 - 这是一个“浅拷贝”,因此它只会复制顶级属性,而任何深层次的对象仍然是引用。许多JavaScript库都具有为您创建深层副本的功能。