2017-01-09 54 views
1

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

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

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

创建阵列看在控制台中的相同,但他们的行为不同,我码。什么可能导致这个?

+6

* “然而他们不同的表现在我的代码” 的数组* - 怎么回事? – Li357

回答

1

更新:尽管下面的答案在技术上是准确的,并且是两种方法之间的另一个区别,但@Ori Drori的回答几乎可以肯定是OP在寻找什么。

我会采取这样的措施,但更多的上下文会有所帮助。

通常情况下,这两个语句通常表现相同,但有一个关键区别 - 当您使用关键字new时,Javascript解释器会调用Array构造函数。

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

举个例子,假设我写了下面的代码:

function Array() { 
} 

方法1,仍能正常工作,但方法2将返回表明填充物的类型错误不是一个函数。

有趣的是,使用数组文字(方法1)仍然会调用数组构造函数,所以如果我在数组构造中做了console.log("test");,那么在使用任何一种方法时仍会将其打印到控制台。但是,当使用Array文本(方法1)时,即使Array构造函数被覆盖,对象本身仍然是标准的JavaScript数组。

3

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

注:第1种方法不会创建阵列

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

+0

有趣。我做了一些谷歌搜索,并发现这一点:https://chrisrng.svbtle.com/es6-array-prototype-fill – VKK