我发现创建数组数组的这两种不同方法会产生不同的行为:
// Method 1
for (var arr1 = []; arr.push([]) < len;) {}
// Method 2
var arr2 = new Array(len).fill([])
在控制台中创建的数组看起来相同,但是在我的代码中它们的行为有所不同。可能导致这种情况的原因是什么?
答案 0 :(得分:3)
不同之处在于,在第一种方法中,每个索引都指向不同的数组,而在Array#fill
中,所有索引都指向同一个数组。
注意:第一种方法不会创建数组数组
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;
答案 1 :(得分:1)
更新:虽然下面的答案在技术上是准确的,并且是两种方法的另一个区别,但@Ori Drori的答案几乎肯定是OP正在寻找的。 strong>
我会对此采取措施,但更多背景会有所帮助。
在通常的实践中,这两个语句通常表现相同,但存在一个关键区别 - 当您使用new
关键字时,Javascript解释器会调用Array构造函数。
如果要覆盖Array构造函数,这只适用于使用new关键字定义的arr2
。使用数组文字创建的arr1
仍然是一个Javascript数组。
作为一个例子,我们说我写了以下代码:
function Array() {
}
方法1仍然有效,但方法2将返回一个TypeError,指示fill不是函数。
有趣的是,使用Array文字(方法1)仍然会调用Array构造函数,因此如果我在Array构造中执行console.log("test");
,则在使用任一方法时仍会将其打印到控制台。但是,当使用Array文字(方法1)时,即使覆盖了数组构造函数,对象本身仍然是标准的Javascript数组。