2015-02-09 82 views
9

究竟是什麼區別:差(空,陣列(X))和陣列(x)的

Array(3) 
// and 
Array.apply(null, Array(3)) 

第一返回[undefined x 3]而第二返回[undefined, undefined, undefined]。第二個是通過Array.prototype.functions鏈接,如.map,但第一個不是。爲什麼?

+0

'Array.apply(NULL,陣列(9))'是*不*'新的Array(9 )'。它將'Array(9)'作爲九個參數傳播到'Array()'中。即使它有效,它也是非常錯誤的方式。例如,你可以'new Array(1e7)'而不是'Array.apply(null,Array(1e7))'。 – Sheepy 2015-12-18 08:05:50

+1

相關:http://stackoverflow.com/questions/22949976/why-does-array-applynull-args-act-inconsistently-when-dealing-with-sparse-a – Sheepy 2015-12-18 08:10:38

回答

13

有一個差異,一個相當重要的。

Array構造接受一個單一號碼,給陣列的lenght,並用「空」的索引的陣列被創建,或更正確的長度被設置,但在陣列並沒有真正包含什麼

Array(3); // creates [], with a length of 3 

當調用了一些作爲唯一的參數數組構造器,您創建一個數組是空的,並且不能用通常的Array方法進行迭代。

或者 ...數組構造函數接受幾個參數,而創建一個數組,其中每個參數是數組中的值

Array(1,2,3); // creates an array [1,2,3] etc. 

當調用此

Array.apply(null, Array(3)) 

它更有趣一點。

apply接受this值作爲第一個參數,並且因爲它不是有用這裏,它被設置爲null

有趣的是第二個參數,其中一個空數組中被傳遞。
作爲apply接受一個數組它會像調用

Array(undefined, undefined, undefined); 

,並創建具有三個指標,這不是空數組,但實際上已經設置爲undefined的價值,這是爲什麼呢CA n被迭代。

TL; DR
的主要區別在於,Array(3)創建具有三個指數是空的陣列。事實上,它們並不存在,數組的長度只有3

空索引來使用apply Array構造這種陣列中傳遞是一樣的做得Array(undefined, undefined, undefined);,其創建一個具有三個undefined索引的陣列,並且undefined事實上是一個值,所以它不是空像在第一例。

map()這樣的數組方法只能遍歷實際值而不是空索引。

0

因爲第一個數組不會有有序的屬性arr[0] === undefined第二個。像forEach和map這樣的數組函數將從0迭代到數組的長度 - 1,並且缺少第一個屬性的順序是一個問題。第二個版本產生具有正確排序的陣列,即,

arr = Array.apply(null, Array(3)); 
arr[0] === undefined //true 
arr[1] === undefined //true 
//etc. 

你注意到的第一個版本沒有。另外,在第一個版本中添加new不會使其工作。

11

.map() API不會遍歷完全未初始化的數組元素。當你使用new Array(n)構造函數創建一個新數組時,會得到一個數組,其中包含您要求的.length,但包含不存在的元素,這些元素將被像.map()這樣的方法跳過。

表達式Array.apply(null, Array(9))顯式使用undefined填充新創建的數組實例,但這已經足夠了。訣竅是in運算符是否會報告數組包含給定索引處的元素。那就是:

var a = new Array(9); 
alert(2 in a); // alerts "false" 

這是因爲數組中的位置2確實沒有元素。但是:

var a = Array.apply(null, Array(9)); 
alert(2 in a); // alerts "true" 

對Array構造函數的外部調用將顯式地填充元素。

+0

感謝您的答案,我不是很確定每個插槽中的「什麼」與未定義的值不同,因爲索引到任何給定的位置都會返回未定義的值。 – 2015-12-18 05:38:44

+1

@ mb_s88在Array(9)中考慮'0'; // false' – 2015-12-18 05:39:35

+0

@ mb_s88回答擴展了一點 – Pointy 2015-12-18 05:40:01

3

這是如何應用的作品。當你這樣做:

new Array(9) 

一個空數組與9. 地圖不訪問不存在的成員長度創建的,所以根本不做任何事。然而,apply接通陣列分爲使用CreateListFromArrayLike,使其變爲所述以前空數組成參數列表等列表:

[undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined]; 

傳遞給陣列創建具有9個成員的陣列,全部用一個值undefined。所以現在地圖會全部訪問它們。

順便說一句,2015年的ECMAScript有Array.prototype.fill這個(見MDN),所以你可以這樣做:

Array(9).fill(0);