以asynchronous方式填充数组
我有两个数组,填充其中的一个随机数字:
var arr1 = [1]; var arr2 = []; function arr1Filler() { arr2 = arr1; setTimeout(function() { for (var i = 0; i < 3; i++) { arr1[i] = Math.floor(Math.random()*5); } console.log('array 1:'); console.log(arr1); console.log('array 2:'); console.log(arr2); }, 500); } setInterval(arr1Filler, 1000);
在这个例子中,为什么这两个数组总是相等的。 换句话说,为什么我得到这样的东西:
array 1: [ 3, 0, 1 ] array 2: [ 3, 0, 1 ] array 1: [ 0, 2, 3 ] array 2: [ 0, 2, 3 ] array 1: [ 1, 2, 4 ] array 2: [ 1, 2, 4 ]
而不是像这样的结果(数组2的最后一个值是数组1的新值):
array 1: [ 1 ] array 2: [ 3, 0, 1 ] array 1: [ 3, 0, 1 ] array 2: [ 0, 2, 3 ] array 1: [ 0, 2, 3 ] array 2: [ 1, 2, 4 ]
我该怎么做才能得到我期待的第二个结果?
它们是相同的,因为您在这里将数组设置为相同的对象:
arr2 = arr1;
所以当你添加到arr1
, arr2
总是相同的。 你想要的是一个arr1
的副本 。 您可以使用slice
来有效地创build一个数组的副本。
arr2 = arr1.slice();
var arr1 = [1]; var arr2 = []; function arr1Filler() { arr2 = arr1.slice(); setTimeout(function() { for (var i = 0; i < 3; i++) { arr1[i] = Math.floor(Math.random()*5); } console.log('array 1:'); console.log(arr1); console.log('array 2:'); console.log(arr2); }, 500); } setInterval(arr1Filler, 1000);