当我在数组中推送另一个值时,为什么JavaScript对象值会发生变化?

时间:2017-08-08 20:09:10

标签: javascript

这是我的代码:

var arr = [];
var obj = {};

(function() {
  for(let i = 1; i <= 10; i++) {
    arr.push(i);
    obj[i] = arr;
  }
})();

这段代码给了我这个输出:

{
  '1': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '2': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '3': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '4': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '5': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '6': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '7': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '8': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '9': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
  '10': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 
}

为什么不给出这样的输出?

{
  '1': [ 1 ], 
  '2': [ 1, 2 ], 
  '3': [ 1, 2, 3 ], 
  '4': [ 1, 2, 3, 4 ], 
  '5': [ 1, 2, 3, 4, 5 ], 
  '6': [ 1, 2, 3, 4, 5, 6 ], 
  '7': [ 1, 2, 3, 4, 5, 6, 7 ], 
  '8': [ 1, 2, 3, 4, 5, 6, 7, 8 ], 
  '9': [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], 
  '10': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
}

1 个答案:

答案 0 :(得分:1)

当您按下时,您每次都会将引用推送到同一个数组。你真正想要的是每次创建一个新的数组,而不是引用相同的数组。

查看此SO答案以获取更多信息Javascript by reference vs. by value

您可以使用arr.sliceArray#from推送副本arr来执行此操作。在最后obj将包含所有10个数字,但var arr = []; var obj = {}; (function() { for(let i = 1; i <= 10; i++) { arr.push(i); obj[i] = arr.slice(); } console.log(obj); })();看起来与您的输出完全相同。

&#13;
&#13;
{{1}}
&#13;
&#13;
&#13;