异步填充数组

时间:2015-05-24 05:45:02

标签: node.js 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 ]

我应该怎样做才能得到我期望的第二个结果?

1 个答案:

答案 0 :(得分:2)

它们是相同的,因为您在此处将数组设置为相同的对象:

arr2 = arr1;

因此,当您添加到arr1时,arr2始终相同。您想要的是arr1副本。您可以使用slice有效地制作数组的副本。

arr2 = arr1.slice();

&#13;
&#13;
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);
&#13;
&#13;
&#13;