90 votes

Les index négatifs dans les tableaux JavaScript doivent-ils contribuer à la longueur du tableau ?

En javascript, je définis un tableau comme ceci

var arr = [1,2,3];

Je peux aussi faire

arr[-1] = 4;

Maintenant si je fais

arr = undefined;

Je perds également la référence à la valeur à arr[-1] .

Donc pour moi, logiquement, il semble que arr[-1] soit aussi une partie de arr .

Mais quand je fais ce qui suit (sans mettre arr à undefined)

arr.length;

Il retourne 3 no 4 ;

Donc mon point de vue est si les tableaux peuvent être utilisés avec des index négatifs, ces indices négatifs devraient également faire partie de leur longueur**. Je ne sais pas, peut-être que je me trompe ou qu'il me manque un concept sur les tableaux.

4voto

HynekS Points 472

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

1voto

ktilcu Points 26

Selon MDN :

La valeur de la propriété length est un entier avec un signe positif et une valeur inférieure à 2 puissance 32 (232).

En Javascript, vous pouvez définir une propriété sur tout objet que vous créez.

var array = new Array();
array = [1,2,3];
array["boom"] = "pow";

De la même manière, lorsque vous définissez un index négatif, il le stocke comme une propriété du tableau plutôt que comme une partie de l'index.

array[-1] = "property does not add to array length";

C'est pourquoi la longueur ne le reflète pas mais une boucle for..in le montre.

-1voto

Ashan Points 119

Lorsque vous utilisez des index non positifs ou non numériques, le tableau se comporte comme un tableau associatif qui comporte des paires clé-valeur.

Pour itérer dans le tableau, vous pouvez utiliser

for(var index in myArray) {
  document.write( index + " : " + myArray[index] + "<br />");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X