创建不同行为的数组数组

时间:2017-01-09 18:54:36

标签: javascript arrays

我发现创建数组数组的这两种不同方法会产生不同的行为:

// Method 1
for (var arr1 = []; arr.push([]) < len;) {}

// Method 2
var arr2 = new Array(len).fill([])

在控制台中创建的数组看起来相同,但是在我的代码中它们的行为有所不同。可能导致这种情况的原因是什么?

2 个答案:

答案 0 :(得分:3)

不同之处在于,在第一种方法中,每个索引都指向不同的数组,而在Array#fill中,所有索引都指向同一个数组。

注意:第一种方法不会创建数组数组

&#13;
&#13;
var len = 3;
var arr1 = [];

// Method 1
for (var arr1 = []; arr1.push([]) < len;) {} // new sub array is pushed into arr1

// Method 2
var arr2 = new Array(len).fill([]) // each place in the array is filled with a reference to the same array 

arr1[0].push(1); // push to the 1st element of arr1
arr2[0].push(1); // push to the 1st element of arr2

console.log('arr1: ', JSON.stringify(arr1)); // only the 1st sub array contains 1
console.log('arr2: ', JSON.stringify(arr2)); // all sub arrays contain 1
&#13;
&#13;
&#13;

答案 1 :(得分:1)

更新:虽然下面的答案在技术上是准确的,并且是两种方法的另一个区别,但@Ori Drori的答案几乎肯定是OP正在寻找的。

我会对此采取措施,但更多背景会有所帮助。

在通常的实践中,这两个语句通常表现相同,但存在一个关键区别 - 当您使用new关键字时,Javascript解释器会调用Array构造函数。

如果要覆盖Array构造函数,这只适用于使用new关键字定义的arr2。使用数组文字创建的arr1仍然是一个Javascript数组。

作为一个例子,我们说我写了以下代码:

function Array() {
}

方法1仍然有效,但方法2将返回一个TypeError,指示fill不是函数。

有趣的是,使用Array文字(方法1)仍然会调用Array构造函数,因此如果我在Array构造中执行console.log("test");,则在使用任一方法时仍会将其打印到控制台。但是,当使用Array文字(方法1)时,即使覆盖了数组构造函数,对象本身仍然是标准的Javascript数组。