Valeurs indéfinies dans l'initialiseur Array (len)

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

Quelle est la raison pour laquelle a.map et b.map produisent des résultats différents?

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

Le constructeur de réseau crée un tableau avec la longueur donnée. Il ne crée pas les clés. La fonction de rappel de Array.prototype.map n'est exécutée que pour les éléments de la liste.
C'est-à-dire toutes les valeurs qui sont associées à une clé (nombre entier) 0 ≤ i < longueur .

  • Array(3) a des touches zéro, de sorte que le .map de .map n'est jamais déclenché.
  • [void 0, void 0, void 0] comporte trois touches, pour lesquelles la fonction callback est exécutée.

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

La spécification et son polyfill sont mentionnés chez MDN. À la ligne 47, if (k in O) { montre que les clés non existantes ne sont pas traitées par la fonction de rappel.

De MDN :

Le rappel n'est invoqué que pour les index du tableau qui ont attribué des valeurs; Il n'est pas invoqué pour les index qui ont été supprimés ou qui n'ont jamais été affectés à des valeurs.

Pour le tableau a , vous avez instancié un tableau de longueur 3 mais n'avez pas assigné de valeurs. La fonction de carte ne trouve aucun élément avec des valeurs assignées, donc il ne produit pas un nouveau tableau.

Pour le tableau b , vous avez instancié un tableau de 3 éléments, chacun avec la valeur undefined . La fonction de carte trouve 3 éléments avec des valeurs assignées et renvoie '0' comme nouvelle valeur pour chacune d'elles dans un nouveau tableau.

a est un tableau vide qui n'a pas d'éléments, donc la fonction de carte produit un tableau vide sans éléments (selon spécification, la carte produit des résultats uniquement si [[HasProperty]] est vrai.) b est un tableau de trois éléments, donc la carte produit un Ensemble de trois éléments.

map annule uniquement les propriétés existantes, et non les indices vides.

Par conséquent, si vous voulez qu'il fonctionne, vous devez d'abord remplir le tableau.

Il existe plusieurs façons de le faire, par exemple:

  • .fill() , introduit dans ES6

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