推入数组后变量值发生变化

时间:2016-03-11 12:57:45

标签: javascript arrays

所以我正在测试这段代码的和平:

<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"

我真的很挣扎,因为我没有更改任何值,名称仍在同一循环中更改。

提前感谢您的回答!

3 个答案:

答案 0 :(得分:7)

在javascript中将对象放入数组意味着您将引用放入数组中的该对象,而不是该对象的。在您的示例中,您创建了一个对象newData,并在循环中更改该对象的name属性。这意味着,在循环结束时,您将使用newData <{1}}对象留下{'name': 'value 2'}

然后,当您查看graphs[0]时,它会告诉您它包含引用到newData,看起来像{'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>