Array est juste un type spécial de Objet dans JS. Il existe une syntaxe spéciale, ce qui est une bonne chose, car elle nous permet de travailler efficacement avec eux. Imaginez combien il serait fastidieux d'écrire un littéral de tableau de cette façon :
const array = {0: 'foo', 1: 'bar', 2: 'baz'} //etc...
Mais ils sont toujours des objets néanmoins. Donc si vous le faites :
const myArray = [42, 'foo', 'bar', 'baz'];
myArray[-1] = 'I am not here';
myArray['whatever'] = 'Hello World';
Ces propriétés non entières seront attachées à un objet (ce qu'est un tableau), mais elles ne sont pas accessibles par certaines méthodes natives telles que Array.length
.
Vous pouvez supposer que la méthode native 'length' est un getter qui compte toutes les propriétés (et les index). son tandis que les valeurs sont les propriétés réelles valeurs ) convertible en un nombre entier positif ou en zéro. Quelque chose comme cette pseudo-implémentation :
En raison de Spécifications le natif length
méthode - en tant que getter ( exampleArray.length
) - vérifiera tous les "nombres entiers non négatifs inférieurs à 2". 32 Obtenez la plus grande des clés et renvoyez sa valeur numérique + 1.
En tant que setter ( exampleArray.length = 42
), il va soit créer des emplacements vides pour les indices "manquants" si la longueur donnée est supérieure au nombre réel de clés entières non négatives, soit supprimer toutes les clés entières non négatives (et leurs valeurs) qui ne sont pas supérieures à la longueur donnée.
La pseudo-implémentation :
const myArray = {
'-1': 'I am not here', // I have to use apostrophes to avoid syntax error
0: 42,
1: 'foo',
2: 'bar',
3: 'baz',
whatever: 'Hello World',
get myLength() {
let highestIndex = -1;
for (let key in this) {
let toInt = parseInt(key, 10);
if (!Number.isNaN(toInt) && toInt > -1) {
// If you're not an integer, that's not your business! Back off!
if (toInt > highestIndex) highestIndex = toInt;
}
}
return highestIndex + 1;
},
set myLength(newLength) {
/* This setter would either:
1) create some empty slots for 'missing' indices if the given length is greater than the actual number of non-negative-integer keys
2) delete all non-negative-integer keys (and their values) which are not greater then the given length.
*/
}
}
console.log(myArray.myLength); // 4
myArray[9] = 'foobar';
console.log(myArray.myLength); // 10