Valori non definiti nell’inizializzatore Array (len)

Prendere in considerazione:

var a = Array(3); var b = [undefined,undefined,undefined]; 

Qual è la ragione per cui a.map e b.map producono risultati diversi?

 a.map(function(){ return 0; }); //produces -> [undefined,undefined,undefined] b.map(function(){ return 0; }); //produces -> [0,0,0] 

Il costruttore di array crea una matrice con la lunghezza specificata. Non crea le chiavi. La funzione di callback di Array.prototype.map viene eseguita solo per gli elementi nell’elenco.
Ovvero, tutti i valori associati a una chiave (numero intero) 0 ≤ i < lunghezza .

  • Array(3) ha zero chiavi, quindi la callback di .map non viene mai triggersta.
  • [void 0, void 0, void 0] ha tre chiavi, per le quali viene eseguita la funzione di callback.

     Array(3).hasOwnProperty(0); // false [void 0, void 0, void 0].hasOwnProperty(0); // true 

Le specifiche e il suo polyfill sono menzionate su MDN. Alla riga 47, if (k in O) { mostra che le chiavi inesistenti non sono trattate dalla funzione di callback.

Da MDN :

la callback è invocata solo per gli indici dell’array che hanno assegnato valori; non è invocato per gli indici che sono stati cancellati o che non sono mai stati assegnati valori.

Per l’array a , hai istanziato un array di lunghezza 3 ma non hai assegnato alcun valore. La funzione mappa non trova elementi con valori assegnati, quindi non produce una nuova matrice.

Per l’array b , hai istanziato un array di 3 elementi, ognuno con il valore undefined . La funzione mappa trova 3 elementi con valori assegnati e restituisce ‘0’ come nuovo valore per ognuno di essi in un nuovo array.

a è un array vuoto che non ha elementi, quindi la funzione map produce un array vuoto senza elementi (per specifica, map produce risultati solo se [[HasProperty]] è vero. b è un array di tre elementi, quindi map produce un serie di tre elementi.

map esegue solo iterazioni di proprietà esistenti, non di indici vuoti.

Pertanto, se si desidera che funzioni, è necessario prima riempire l’array.

Ci sono molti modi per farlo, ad esempio:

  • .fill() , introdotto in ES6

     console.log(new Array(3).fill().map(function(){ return 0; }));