【问题标题】:setting value for array object via index sets all array items通过索引设置数组对象的值设置所有数组项
【发布时间】:2012-04-13 06:50:41
【问题描述】:

我有一个带有数组的复杂 javascript 对象。当我尝试为索引的一个属性设置值时,它会应用于数组的所有项。

这是一个基本的例子:

var obj = new Object();    
obj.arr = [];
obj.arr[0] = {pos:[0,0]};
obj.arr[1] = {pos:[0,0]};

现在,如果我通过特定索引为对象的属性设置值,

obj.arr[0].pos = [10,10];
obj.arr[1].pos = [5,5];

这里似乎为数组的两个项目设置了值[5,5]。结果值为:

console.log(obj.arr[0].pos) 返回[5,5]

console.log(obj.arr[1].pos) 也返回 [5,5]

我的实际对象要复杂得多,但这是正在发生的事情的基本概念......

有什么想法吗?

【问题讨论】:

  • 在 chrome 上工作正常,你的浏览器是什么?
  • 它工作正常。你可以在jsfiddle.net/swzF9看到。

标签: javascript arrays object


【解决方案1】:

它们共享相同的链接,即一个对象的多个变量/属性引用相同的值。

确切答案(错误在哪里)取决于您的对象是如何组成的。

var nested = {a:1};
var obj = {arr:[]};
obj.arr[0] = {pos:0, n:nested};
obj.arr[1] = {pos:0, n:nested};

obj.arr[0].pos = 1;
obj.arr[1].pos == 1; // false
obj.arr[0].nested.a = 2;
obj.arr[1].nested.a == 2; // true

同一个数组/对象literals的赋值不一样。

var a = [0];
var b = [0];
b[0] = 1;
a[0] == 1; // false
b = a;
a[0] = 2;
b[0] == 2; // true

a = b = [0];
a[0] = 1;
b[0] == 1; // true

【讨论】:

  • 不确定你的意思..索引值不应该让两个对象分开吗?如果它们有不同的索引,它们如何共享相同的链接?
  • 更新了问题并修正了一些错别字.. 仍然不明白问题。
  • 您的示例给出以下输出:Object { pos=[2]}Object { pos=[2], coords=[2]}。也许,代码中有一个地方,您可以在其中执行obj.arr[0] = obj.arr[1] 之类的操作。
  • 我无法在较小的范围内重现该问题.. 上面的示例只是让您了解我在实际项目中遇到的问题.. 我认为上面的代码确实有效正如预期的那样,但我现实世界的问题是一个更复杂的对象。
  • 人犯错误的频率是计算机的数百万倍。 Javascript 总是以相同的方式工作:如果分配了某个组合值(数组、对象等),则它是通过引用分配的。从那时起,两个变量共享相同的组合值。改变其中一个也会改变另一个。
猜你喜欢
  • 1970-01-01
  • 2015-07-17
  • 2014-09-02
  • 2018-12-06
  • 1970-01-01
  • 2015-07-13
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多