2013-09-28 125 views
4

我想在javascript中聲明並用0初始化一個數組。我創建了一個數組並設置這個長度。javascript Array with map

var previousRow = []; 
previousRow.length = 5; 

然後,我做到了。

console.log(previousRow); 
previousRow = previousRow.map(Number.prototype.valueOf, 0); 
console.log(previousRow); 

和我,

[ , , , , ] 
[ , , , , ] 

但是,當我做

console.log(previousRow); 
previousRow = Array.apply(null, previousRow).map(Number.prototype.valueOf, 0); 
console.log(previousRow); 

我得到了我的預期

[ , , , , ] 
[ 0, 0, 0, 0, 0 ] 

爲什麼第一個代碼沒有工作?

+2

見相關:http://stackoverflow.com/q/18947892/ 617762 – Zirak

回答

13

閱讀map的MDN文檔。它明確指出:

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

previousRow陣列的length5空數組。然而,元件從未被分配一個值:

var previousRow = []; 
previousRow.length = 5; 

由於previousRow元件從未被分配它們永遠不會由map進行處理的值。因此在previousRow映射Number.prototype.valueOf將導致5個元素的空數組:

console.log(previousRow); 
previousRow = previousRow.map(Number.prototype.valueOf, 0); 
console.log(previousRow); 

然而,當你applypreviousRowArray構造的構造創建新的數組和previousRow的值指定給新的數組。

previousRow的元素是否被分配了值並不重要。當JavaScript找不到值時,它將提供undefined

因此,淨效應是,新的陣列具有5種元素的所有這些都分配undefined明確地由Array構造。因此,你可以使用map來處理整個數組:

console.log(previousRow); 
previousRow = Array.apply(null, previousRow).map(Number.prototype.valueOf, 0); 
console.log(previousRow); 

你應該閱讀下面的答案更深入的解釋:https://stackoverflow.com/a/18949651/783743