105 votes

Sont les tableaux Javascript éparses?

C'est, si j'utilise l'heure actuelle comme un index dans le tableau:

array[Date.getTime()] = value;

sera l'interprète instancier tous les éléments de 0 à maintenant? Faire les différents navigateurs de faire les choses différemment?

Je me souviens, il y avait un bug dans la AIX noyau, qui permettrait de créer des pseudo-ttys sur demande, mais si vous avez, disons, "echo > /dev/pty10000000000" il serait de créer /dev/pty0, /dev/pty1, .... et puis tomber morts. C'était amusant à des foires commerciales, mais je ne veux pas que cela arrive à mes clients.

77voto

John Kugelman Points 108754

Oui, ils sont. Ils sont en fait les tables de hachage en interne, de sorte que vous pouvez utiliser non seulement les grands entiers, mais aussi des chaînes, des flotteurs, ou d'autres objets. Toutes les touches sont convertis en chaînes via toString() avant d'être ajoutée à la valeur de hachage. Vous pouvez le vérifier avec un test de code:

<script>
  var array = [];
  array[0] = "zero";
  array[new Date().getTime()] = "now";
  array[3.14] = "pi";

  for (var i in array) {
      alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i));
  }
</script>

Affiche:

array[0] = zero, typeof(0) == string
array[1254503972355] = now, typeof(1254503972355) == string
array[3.14] = pi, typeof(3.14) == string

Vous remarquerez que j'ai utilisé for...in de la syntaxe, qui ne vous donne les indices qui sont en fait définis. Si vous utilisez la plus fréquente for (var i = 0; i < array.length; ++i) style de l'itération, alors vous aura évidemment des problèmes de non-standard indices de tableau.

42voto

Christoph Points 64389

Comment exactement les tableaux JavaScript sont mis en œuvre diffère d'un navigateur à l'autre, mais généralement, ils retombent éparse de la mise en œuvre, probablement le même que celui utilisé pour l'accès à la propriété des objets réguliers - en cas d'utilisation d'un tableau réel serait inefficace.

Vous devez demander à quelqu'un avec plus de connaissances sur les implémentations spécifiques pour répondre à ce excatly déclenche le passage de la dense éparse, mais votre exemple doit être parfaitement sûr. Si vous souhaitez obtenir un tableau dense, vous devriez appeler le constructeur explicitement un argument de longueur et espérons que vous obtenez en fait.

Voir cette réponse pour une description plus détaillée par olliej.

11voto

John Fisher Points 13621

Vous pouvez éviter ce problème en utilisant une syntaxe javascript conçu pour ce genre de chose. Vous pouvez le traiter comme un dictionnaire, pourtant, le "for ... in ..." syntaxe vous permettra de saisir toutes les.

var sparse = {}; // not []
sparse["whatever"] = "something";

7voto

Justin Love Points 3073

Les objets Javascript sont rares, et les tableaux sont juste spécialisé objets avec un auto-entretenu de la longueur de la propriété (qui est en fait une plus grande que le plus grand indice, pas le nombre d'éléments définis) et quelques autres méthodes. Vous êtes en sécurité; utiliser un tableau si vous avez besoin de fonctionnalités supplémentaires, et un objet autrement.

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