Hello,
Voici un peu de théorie pour expliquer la philosophie de la chose.
Les tableaux sont des objets JavaScript comme les autres : ils ont un prototype et des propriétés propres. Le prototype est l’objet dont ils héritent des propriétés : c’est l’objet Array.prototype
dans le cas des tableaux, dont ils héritent par exemple map
et fill
. length
est l’unique propriété propre du tableau empty
que tu as créé. Tu peux lui en ajouter d’autres par la suite.
var empty = new Array(10);
Object.getPrototypeOf(empty) === Array.prototype;
Object.getOwnPropertyNames(empty);
Object.getOwnPropertyNames(Array.prototype);
Les cases d’un tableau sont elles-mêmes des propriétés à peu près comme les autres, dont le nom se trouve être un numéro compris entre 0 et la valeur de la propriété length
.
var toto = ["a", "b", "c"];
Object.getOwnPropertyNames(toto);
toto.length;
toto[3] = "d";
toto.length;
Object.getOwnPropertyNames(toto);
toto.length = 2;
Object.getOwnPropertyNames(toto);
Comme toutes les autres propriétés, les cases d’un tableau peuvent être absentes : on dit dans ce cas que le tableau a des trous.
Object.getOwnPropertyNames(["a",,,,"b",,,,"c"]);
var empty = new Array(10);
Object.getOwnPropertyNames(empty);
empty.fill("toto");
Object.getOwnPropertyNames(empty);
delete empty[5];
Object.getOwnPropertyNames(empty);
La fonction Array.prototype.map
ne s’occupe pas des trous dans un tableau : c’est seulement pour les cases où il y a bien un élément qu’elle appliquera la fonction donnée en paramètre. J’en profite pour soulever une petite subtilité : si une case contienne undefined
, la case est bien présente, ce n’est pas un trou, bien que lorsque qu’on essaye d’accéder à une case qui est un trou on obtienne par convention l’objet undefined
. D’où les résultats ci-dessous, où empty
est la convention d’affichage de Chrome pour les trous :
["a",,,,"b",,,,"c"].map(e => "power");
new Array(10).map(e => "power");
[0, 1, 2].map(e => "power");
[undefined, , undefined].map(e => "power");