116 votes

Y a-t-il une limite à la longueur de la clé (chaîne) dans l'objet JS ?

Nous avions donc un cas où nous avions un objet, où la clé est l'id (int) et la valeur est la chaîne. Mais nous avons remarqué que la plupart du temps, nous recherchons l'identifiant en fonction de la chaîne de caractères, nous avons donc décidé d'inverser le processus et de faire de la chaîne de caractères la clé et de la valeur l'identifiant. De cette façon, au lieu de passer en revue chaque élément et de comparer les valeurs, nous pourrions simplement faire ce qui suit var id = storage[text]; . Vous trouverez ci-dessous des exemples de ce que nous avons fait.

Voici l'exemple de l'ancienne mise en œuvre :

var storage = {
  0 : null,
  1 : "Hello",
  2 : "world!",
  3 : "How are you?"
}

Voici l'exemple de la nouvelle mise en œuvre :

var storage = {
  "null" : 0,
  "Hello" : 1,
  "world!" : 2,
  "How are you?" : 3
}

Je comprends que maintenant la chaîne est la clé et qu'il est possible d'obtenir le même identifiant pour les mêmes chaînes. Mais comme maintenant la chaîne peut être potentiellement assez énorme (il y a peu de chance, mais probablement 1KB maximum par chaîne), Y a-t-il une limite de longueur que JS ou Android webview met sur les clés des objets ?

Et aussi, cette mise en œuvre présente-t-elle des inconvénients ? Je n'ai pas remarqué de problèmes jusqu'à présent, mais on ne sait jamais.

130voto

hashchange Points 979

J'ai fait quelques recherches à ce sujet.

MDN est silencieux sur la question, de même que la spécification ( ES5 , ES6 ). Elles indiquent seulement que l'accesseur de la propriété doit être une chaîne de caractères, sans aucune qualification - en d'autres termes, il n'y a pas de limite en ce qui concerne la spécification. Ce n'est guère surprenant.

La façon dont les navigateurs le gèrent est une autre question. J'ai mis en place un test et l'exécuter dans un certain nombre de navigateurs. Chrome 40 (Desktop), Chrome 40 (Android 5.1), Firefox 36, Opera 27 et IE9+ peuvent traiter un nom de propriété pouvant aller jusqu'à 2 27 personnages. Safari 8 (OS X Yosemite) peut même gérer les noms de propriétés de 2 30 des personnages.

Pour tous ces navigateurs, à l'exception d'IE, la longueur maximale des propriétés est la même que la longueur maximale des chaînes de caractères. IE9+ peut gérer une longueur maximale de chaîne de ~2 30 caractères, mais la limite pour les clés d'objet est de 2 27 caractères, comme dans les autres navigateurs.

Le test n'a pas fonctionné dans IE8 et Safari sur iOS, vraisemblablement en raison de problèmes de mémoire causés par le code de test.

En un mot, il est prudent d'utiliser des noms de propriétés longs, même en poussant la chose à l'extrême. Tant que les chaînes de caractères elles-mêmes restent dans les limites de ce que les navigateurs peuvent gérer, vous pouvez également les utiliser comme noms de propriétés.

38voto

Ridcully Points 8353

Non, il n'y a pas de limite pour la longueur de la chaîne (tant qu'elle tient dans la mémoire), et votre implémentation semble correcte également. En fait, il est assez courant d'avoir ces tableaux "retournés" avec, par exemple, des valeurs booléennes. Quant aux chaînes de caractères en tant que clés : Les chaînes sont des symboles immuables qui sont stockés à une certaine adresse, et ce qui est utilisé comme index pour le tableau est cette adresse (aka pointeur aka référence) et non la chaîne elle-même.

16voto

Il semble qu'avec ECMAScript 2016, il existe désormais une réponse définitive à cette question. Selon le MDN Web Docs sur string.length :

ECMAScript 2016 (ed. 7) a établi une longueur maximale de 2^53 - 1 éléments. Auparavant, aucune longueur maximale n'était spécifiée.

Vous pouvez également trouver cette spécification dans le Spécification du langage ECMAScript® 2016 :

Le type String est l'ensemble de toutes les séquences ordonnées de zéro ou plus de valeurs entières non signées de 16 bits ("éléments") jusqu'à une longueur maximale de 2 53 -1 éléments.

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