2013-10-28 59 views
3

我希望下面的代碼返回[1,1,1,1...](new Array(10))。map(function(){return 1;})返回[,,,,...]爲什麼?

(new Array(10)).map(function() { return 1;}) 

但它返回[, , , , , ...]

此外, (new Array(10)).length == 10(new Array(10))[0] == undefined是正確的。

而對於z = function(){return 0;};,表達式z(undefined) === 0也是如此。

但我注意到[,,,,,,,,,,].map(function() { return 1; })也返回[,,,,....]

任何人都可以解釋,爲什麼?

回答

3

這將工作:

Array.apply(null, Array(10)).map(… 

現場演示:http://jsfiddle.net/xXG5p/

你必須使數組密集第一。 new Array(n)創建一個稀疏數組。稀疏陣列確實有length,但他們有沒有元素。因此,.map()調用根本不會迭代。

使用我上面的代碼,您將創建一個包含元素的密集數組(其值初始設置爲null)。

+0

其他人都在談論爲什麼它無法工作。您改爲提供解決方案。謝謝! – jsuddsjr

7

所以。我期望下面的代碼返回[1,1,1,1 ...]。

(new Array(10)).map(function() { return 1;}) 但它返回[,,,,...]。

右,因爲new Array(10)創建具有沒有元素爲10的length,和map僅遍歷實際存在元素的數組。 (是的,這是令人驚訝 :-))

此外,(new Array(10)).length == 10(new Array(10))[0] == undefinedtrue

同樣正確的,因爲(再次)new Array(10)不把數組中的任何元素,所以訪問[0]給你undefined

JavaScript的標準陣列aren't really arrays at all,他們可以有一個length這是一個沒有任何條目的正數。它們是一種「稀疏」陣列。

讓我們來簡單的例子:

var a = new Array(10); 
a[2] = 1; 

該數組包含一個元素,在指數2的元素。索引0上沒有元素,索引1上沒有元素,索引3及以上也沒有元​​素。它只是在那裏存在差距。你可以要求它告訴:

在JavaScript
console.log(0 in a); // "false" 
console.log(1 in a); // "false" 
console.log(2 in a); // "true" 

標準陣列只是分配給length特殊的行爲,被分配到一個類屬性名稱(鬆散的,數字的)的特殊行爲的對象,並且由Array.prototype支持。

這一切都與較新的「類型」數組,Int32Array等,這是傳統意義上的真正數組形成對比。

1

這裏是Mozilla開發者網絡說怎麼樣Array.prototype.map

調用回調函數僅適用於已分配值的數組的索引;對於已刪除或從未分配過值的索引,不會調用它。

當你調用new Array(10),創建Array認爲它是10元長,但沒有它的指標曾經被分配到。下面是會發生什麼,如果你使用一個文字數組,你有沒有一些指標設置值的示例:

[1, , 3].map(function() {return "a"}) 

你得到的值是:

[ 'a', , 'a' ] 

因爲在索引1,沒有價值被分配。

相關問題