我写了一些简单的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
答案 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>
firstobj
&#13;
答案 4 :(得分:0)
数组中的每个元素都指向同一个对象。 因此,当您更改对象值时,它会反映在所有元素中。