2017-06-14 77 views
2

new Array(3)返回包含3個undefined S的相當於[undefined, undefined, undefined]長度3的陣列;的Javascript映射()

然而,

[undefined, undefined, undefined].map((val, i) => i)產生的[0, 1, 2]預期的結果。但new Array(3).map((val, i) => i)產生[undefined, undefined, undefined],彷彿映射功能沒有任何影響。

誰能解釋一下爲什麼?

編輯 看起來我的理解存在缺陷new Array()。它不會創建一個新的數組。它創建一個對象,其鍵值爲length,等於傳入的參數。感謝您的答案和評論。

順便說一句,如果你確實需要像[undefined, undefined, undefined]這樣的數組迭代/映射,或者任何事情,那麼[...new Array(m)]應該做的伎倆。

+3

*含有3個undefineds這相當於[未定義,未定義未定義]; *這是不對的。 – 2017-06-14 16:50:52

+0

Javascript中的數組是具有數值屬性和'length'屬性的奇特對象。 在'新陣列的情況下(3)',則產生具有其'length'設置爲3,但沒有任何數值屬性的'Array'對象。你可以看到: > Object.keys(new Array(3)); Object.keys([undefined,undefined,undefined]); [「0」,「1」,「2」] 你可以用['Array.from']實現你想要的(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from?v = control): > Object.keys(Array.from({length:3})); [「0」,「1」,「2」] – error

+0

Doh。鎖定之前,我可以發佈我的答案。 – error

回答

3

一個重要的事情要明白,有在JavaScript中沒有數組類型。內置Array只是包裹在標準Object上的便利。唯一的區別是數組具有以特殊方式計算的length屬性。

new Array(3)返回一個對象與單個length字段。它不包含任何其他鍵。

{ 
    length: 3 
} 

[undefined, undefined, undefined]創建了3個數字插槽的對象:

{ 
    length: 3 
    0: undefined, 
    1: undefined, 
    2: undefined, 
} 

這使得差別,因爲map和其他迭代尋找實際存在的物體數字鍵。後面mapforEach和朋友的邏輯是這樣的:

for (var i = 0; i < A.length; i++) 
     if (A.hasOwnProperty(i)) 
      do something with A[i] 
3

新陣列(3)返回含有3個undefineds長度3的陣列,其等於[未定義,未定義未定義];

未按MDN

這意味着arrayLength空槽,以實際未定義的值不是槽陣列

3

當你新陣列(3)的Javascript保留記憶一個3個元素的數組,但沒有定義它們中的任何一個。

當你通過[undefined,undefined undefined]創建一個數組時,它實際上創建了3個元素,每個元素的值都是未定義的(因此它是一個長度爲3的數組)。