2016-01-21 12 views
7

Ho trovato strano comportamento (testato a Chrome)(new Array (x)) mappa Stranges

[1,2].map(function() { console.log(arguments); }) 
// [1, 0, Array[2]] 
// [2, 1, Array[2]] 
// [undefined, undefined] 

e questo è ok - ok come nella documentazione Ma

(new Array(20)).map(function() { console.log(arguments); }) 
//[undefined × 20] 

E doesn' t utilizzare la funzione di richiamata (nessuna azione, debugger all'interno non funziona ecc.). Perché??

La sintassi new Array(arrayLength) deve creare una matrice con una determinata lunghezza. E lo fa. Ma cosa con .map?

risposta

8

Da MDN:

callback viene richiamato solo per gli indici dell'array che hanno assegnato valori, compresi indefinito. Non viene chiamato per gli elementi mancanti di l'array (ovvero, gli indici che non sono mai stati impostati, che sono stati eliminati o a cui non è mai stato assegnato un valore).

Quando si dichiara un array usando new Array(), tutti gli elementi non sono definiti, ma non sono stati assegnati undefined come valore. Pertanto, vengono saltati nella chiamata a map().

È possibile utilizzare join() e split() assegnare esplicitamente undefined a ciascun elemento, e avrete quindi ottenere i risultati attesi:

(new Array(20).join(undefined).split(undefined)).map(function() { console.log(arguments); })

+1

Hehe .. Si mi ha battuto ad esso: -) – Amit

+0

Più elegante in ES6: '[... Array (20)]. Map (function (... args) {console.log (args);})' – nils

Problemi correlati