javascript有什么问题?

时间:2015-12-28 07:58:26

标签: javascript arrays json object

我写了一些简单的javascript代码,但它没有返回预期的结果。

var arr = new Array();

var firstobj = {
   cta: 0,
   ccc: 0,
   crc: 0
}
for (var ta = 1; ta <= 10; ta++) {
    arr[ta] = firstobj;
}

arr[6].cta = 1;
console.log(arr);

我只改变第6个元素的cta值,但它会改变所有元素。

预期:

[{cta:0, ccc:0, crc:0}, ..., {cta:1, ccc:0, crc:0}, {cta:0, ccc:0, crc:0}, ...]
//                                ^ 6th element

实际值:

[{cta:1, ccc:0, crc:0, ...] // All have 1

5 个答案:

答案 0 :(得分:4)

Javascript中的对象是由指针指定的(技术上JS没有指针,但它的工作方式与其他语言中的指针一样)。因此,您已经填充了数组,以便每个元素都包含对完全相同对象的指针式引用。因此,当您更改该对象时,您会看到所有更改,因为只有一个对象并且您更改了它。

如果要使用单独的对象初始化数组,则必须创建新对象或克隆现有对象,并将该单独的对象分配到数组的每个元素中。

例如,您可以这样做:

var myArray = [];
var obj;
// Also, arrays start from 0, not from 1.
for (var i = 0; i < 10; i++) {
  // create a new object for each item in the array
  obj = {cta:0, ccc:0, crc:0};
  myArray[i] = obj;
} 

myArray[6].cta = 1;
document.write(JSON.stringify(myArray));

答案 1 :(得分:1)

  

只有第6个元素的cta值必须为1,但所有元素都是cta   价值观发生了变化。

数组中的所有元素(除了零索引处的元素,在您的情况下为undefined)指的是同一个对象,因此如果您在一个元素中更改属性,则会在所有元素中重新选择< / p>

答案 2 :(得分:1)

您为数组中的所有值分配了相同的对象引用

制作它(使用Object.create

for (var ta = 1; ta <=  10; ta++) 
{
    arr [ta] = Object.create( firstobj );
}

答案 3 :(得分:1)

当您将相同的if (responseCount(response) >= 3) { call.cancel(); // If we've failed 3 times, give up. } 保存到数组时,它会通过引用保存,因此当您更改其中一个值时,它会更改所有值,我的建议是为数组中的每个元素创建一个新对象。 / p>

&#13;
&#13;
firstobj
&#13;
&#13;
&#13;

答案 4 :(得分:0)

数组中的每个元素都指向同一个对象。 因此,当您更改对象值时,它会反映在所有元素中。