Javascript阵列中的对象神秘地链接在一起

时间:2015-07-31 17:19:36

标签: javascript

我有以下代码。当我访问w [1] [0]时,我只希望更改该位置的对象。但是,所有对象都会改变。我假设这是因为在某种程度上,它们都指向同一个对象。我该如何解决这个问题?

heroku pg:push ReadingList_development DATABASE_URL --app calm-eyrie-9110

2 个答案:

答案 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库都具有为您创建深层副本的功能。