JavaScript“new Array(n)”和“Array.prototype.map”古怪


Answers

我有一個任務,我只知道數組的長度和需要轉換的項目。 我想要做這樣的事情:

let arr = new Array(10).map((val,idx) => idx);

要快速創建一個像這樣的數組:

[0,1,2,3,4,5,6,7,8,9]

但它沒有奏效,因為:請參閱Jonathan Lonowski的回答上面的幾個答案。

解決方法可以是使用Array.prototype.fill()填充具有任何值的數組項(即使未定義Array.prototype.fill()

let arr = new Array(10).fill(undefined).map((val,idx) => idx);

console.log(new Array(10).fill(undefined).map((val, idx) => idx));

更新

另一個解決方案可能是

let arr = Array.apply(null, Array(10)).map((val, idx) => idx);

console.log(Array.apply(null, Array(10)).map((val, idx) => idx));

Question

我在Firefox-3.5.7 / Firebug-1.5.3和Firefox-3.6.16 / Firebug-1.6.2中觀察到了這一點

當我點燃Firebug時:

    >>> x = new Array(3)
    [undefined, undefined, undefined]
    >>> y = [undefined, undefined, undefined]
    [undefined, undefined, undefined]

    >>> x.constructor == y.constructor
    true

    >>> x.map(function(){ return 0; })
    [undefined, undefined, undefined]
    >>> y.map(function(){ return 0; })
    [0, 0, 0]

這裡發生了什麼? 這是一個錯誤,還是我誤解如何使用new Array(3)




map的MDC頁面:

[...] callback僅針對已賦值的數組的索引; [...]

[undefined]實際上將setter應用於索引(es),以便map將迭代,而new Array(1)僅使用undefined的默認值初始化索引(es),以便map跳過它。

我相信這對所有迭代方法都是一樣的。




我認為解釋這個最好的方法是看看Chrome處理它的方式。

>>> x = new Array(3)
[]
>>> x.length
3

所以實際發生的是新的Array()返回一個長度為3但沒有值的空數組。 因此,當您在技術上空的陣列上運行x.map時,沒有任何設置。

即使沒有任何值,Firefox也會'未填充'這些空插槽。

我不認為這明顯是一個錯誤,只是表示發生了什麼的糟糕方式。 我認為Chrome的“更正確”是因為它顯示陣列中實際上沒有任何東西。




剛剛碰到了這個。 能夠使用Array(n).map確實會很方便。

Array(3)大致產生{length: 3}

[undefined, undefined, undefined]創建編號的屬性:
{0: undefined, 1: undefined, 2: undefined, length: 3}

map()實現僅對已定義的屬性起作用。




在Chrome中,如果我使用new Array(3)我會得到[] ,所以我的猜測是您遇到了瀏覽器錯誤。




如果你這樣做是為了容易地填充一個帶有值的數組,你不能使用fill來滿足瀏覽器支持的原因,也不希望做一個for循環,你也可以使用x = new Array(3).join(".").split(".").map(...它會給你一個空字符串數組。

非常醜陋,我不得不說,但至少問題和意圖是相當清楚的溝通。




Links