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

Guy*_*ies 1 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>
Run Code Online (Sandbox Code Playgroud)

我在网络控制台中获得了以下输出:

value 0 
Array [ Object ] 
value 1 
Array [ Object, Object ]
Run Code Online (Sandbox Code Playgroud)

数组中的所有对象具有完全相同的值:

name:"value 1"
Run Code Online (Sandbox Code Playgroud)

我真的为此感到挣扎,因为我不更改任何值,并且名称仍在同一循环中更改。

预先感谢您的回答!

Mat*_*uns 8

在javascript中将对象放入数组意味着您要在数组中放置对该对象的引用,而不是该对象的。在您的示例中,您创建了一个对象,newData然后在循环中更改了该对象的name属性。这意味着在循环结束时,您将剩下一个newData带有{'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);
}
Run Code Online (Sandbox Code Playgroud)