web-dev-qa-db-fra.com

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

Nous avons donc eu un cas où nous aurions un objet, où la clé est id (int) et la valeur est la chaîne. Mais nous avons remarqué que la plupart du temps, nous recherchons id en fonction de la chaîne, nous avons donc décidé de l'inverser et de faire d'une chaîne la clé et la valeur est l'id. Parce que de cette façon, au lieu de parcourir chaque élément et de comparer les valeurs, nous pourrions simplement faire var id = storage[text];. Voici des exemples de ce que nous avons fait.

Voici l'exemple de l'ancienne implémentation:

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

Voici l'exemple de la nouvelle implémentation:

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

Je comprends que maintenant la chaîne est la clé et il est correct d'obtenir le même identifiant pour les mêmes chaînes. Mais depuis maintenant, la chaîne peut être potentiellement assez énorme (mince chance, mais probablement max 1 Ko par chaîne), y a-t-il une limite de longueur JS ou Android webview met les clés d'objet?

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

65
Sherzod

J'ai un peu recherché cela.

MDN est silencieux sur la question, tout comme la spécification ( ES5 , ES6 ). Ils indiquent seulement que l'accesseur de propriété doit être une chaîne, 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 manière dont les navigateurs le gèrent est une autre affaire. J'ai configuré n test et je l'ai exécuté dans un certain nombre de navigateurs. Chrome 40 (bureau), Chrome 40 (Android 5.1), Firefox 36, Opera 27 et IE9 + peuvent traiter) avec un nom de propriété jusqu'à 227 personnages. Safari 8 (OS X Yosemite) peut même gérer les noms de propriété de 230 personnages.

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

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

En un mot, il est sûr d'utiliser des noms de propriété longs, même en les poussant à l'extrême. Tant que les chaînes 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é.

74
hashchange

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

31
Ridcully

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

ECMAScript 2016 (éd. 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 cela spécifié dans le ECMAScript® 2016 Language Specification :

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

3