所以我正在测试这段代码的和平:
<script>
var newData = {}, graphs = []
for(var j=0; j<2; j++){
newData["name"] = 'value '+ j
console.log(newData["name"]);
graphs.push(newData);
console.log(graphs);
}
</script>
我在webconsole中有以下输出:
value 0
Array [ Object ]
value 1
Array [ Object, Object ]
数组中的所有对象具有完全相同的值:
name:"value 1"
我真的很挣扎,因为我没有更改任何值,名称仍在同一循环中更改。
提前感谢您的回答!
答案 0 :(得分:7)
在javascript中将对象放入数组意味着您将引用放入数组中的该对象,而不是该对象的值。在您的示例中,您创建了一个对象newData
,并在循环中更改该对象的name属性。这意味着,在循环结束时,您将使用newData
<{1}}对象留下{'name': 'value 2'}
然后,当您查看graphs[0]
时,它会告诉您它包含{'name': 'value 2'}
。同样适用于graphs[1]
你可以通过在数组中每次创建一个新对象来解决这个问题:
graphs = []
for(var j=0; j<2; j++){
var newData = {}
newData["name"] = 'value '+ j
console.log(newData["name"]);
graphs.push(newData);
console.log(graphs);
}
答案 1 :(得分:0)
感谢deceze的回答! 我忘记了Js只是通过引用来调用。 这段代码正在运行:
var graphs = []
for(var j=0; j<2; j++){
newData = {}
newData["name"] = 'value '+ j
console.log(newData["name"]);
graphs.push(newData);
console.log(graphs);
}
答案 2 :(得分:0)
编辑:您必须重新初始化循环中的newData
。因为newData
的对象引用是相同的,并且每次都用新值覆盖旧值,因此只能看到最新值。
尝试,
<script>
var graphs = [];
for(var j=0; j<2; j++){
var newData = {};
newData["name"] = 'value '+ j
console.log(newData["name"]);
graphs.push(newData);
console.log(graphs);
}
</script>