【问题标题】:Variable value changes after pushing in array [duplicate]推入数组后变量值发生变化[重复]
【发布时间】:2016-03-11 12:57:44
【问题描述】:

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

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

我真的在为此苦苦挣扎,因为我没有更改任何值,并且名称仍然在同一个循环中更改。

提前感谢您的回答!

【问题讨论】:

  • 您正在更改同一个对象的属性。您永远不会在任何地方创建第二个对象,只有一个对象会被多次引用。
  • 为了清楚起见,我只想补充一点,在循环的第二次迭代发生之前,数组是 [{name:"value 0"}]。在第二次迭代中,它变为 [{name:"value 1"},{name:"value 1"}]。

标签: javascript arrays


【解决方案1】:

在 javascript 中将对象放入数组意味着您将 reference 放入数组中的该对象,而不是该对象的 value。在您的示例中,您创建一个对象 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);
}

【讨论】:

  • Mrmrmrm.... 持有对象的变量的 对所述对象的引用。您正在将一个放入数组中,恰好该值是一个间接... /pedantic :o)
  • 你是绝对正确的,我会更新我的答案以反映这一点
  • 也许应该注意的是,对newData["name"] 的任何更改 for 循环(即newData["name"] = 'object name';)都会更改最后一项并且仅更改@ 中的最后一项987654330@ 数组当然除非 newData 事先再次重新初始化。
【解决方案2】:

感谢 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);
  }

【讨论】:

    【解决方案3】:

    编辑:您必须在循环中重新初始化 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2018-10-29
      相关资源
      最近更新 更多