Gibt es eine Längenbeschränkung für den Schlüssel (String) im JS-Objekt?

84

Wir hatten also einen Fall, in dem wir ein Objekt hätten, in dem der Schlüssel id (int) und der Wert die Zeichenfolge ist. Wir haben jedoch festgestellt, dass wir die ID meistens anhand der Zeichenfolge nachschlagen. Daher haben wir beschlossen, sie umzukehren und eine Zeichenfolge zum Schlüssel zu machen, und der Wert ist die ID. Denn auf diese Weise könnten wir einfach jedes Element durchgehen und Werte vergleichen var id = storage[text];. Nachfolgend finden Sie Beispiele dafür, was wir getan haben.

Hier ist das Beispiel der alten Implementierung:

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

Hier ist das Beispiel der neuen Implementierung:

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

Ich verstehe, dass jetzt die Zeichenfolge der Schlüssel ist und es in Ordnung ist, dieselbe ID für dieselben Zeichenfolgen zu erhalten. Aber da die Zeichenfolge jetzt möglicherweise ziemlich groß sein kann (geringe Wahrscheinlichkeit, aber wahrscheinlich maximal 1 KB pro Zeichenfolge), gibt es eine Längenbeschränkung, die JS oder Android Webview für die Objektschlüssel festlegen?

Und hat diese Implementierung auch Nachteile? Ich habe bisher keine Probleme bemerkt, aber Sie wissen es nie.

Sherzod
quelle

Antworten:

96

Ich habe das ein bisschen recherchiert.

MDN schweigt zu diesem Thema, ebenso wie die Spezifikation ( ES5 , ES6 ). Sie geben nur an, dass der Property Accessor eine Zeichenfolge ohne Qualifikationen sein muss - mit anderen Worten, es gibt keine Begrenzung für die Spezifikation. Das ist kaum überraschend.

Wie Browser damit umgehen, ist eine andere Sache. Ich habe einen Test eingerichtet und ihn in mehreren Browsern ausgeführt. Chrome 40 (Desktop), Chrome 40 (Android 5.1), Firefox 36, Opera 27 und IE9 + können mit einem Eigenschaftsnamen von bis zu 2 27 Zeichen umgehen . Safari 8 (OS X Yosemite) kann sogar Eigenschaftsnamen mit 2 bis 30 Zeichen verarbeiten.

Für alle diese Browser außer IE entspricht die maximale Eigenschaftslänge der maximalen Zeichenfolgenlänge. IE9 + kann eine maximale Zeichenfolgenlänge von ~ 2 30 Zeichen verarbeiten, die Grenze für Objektschlüssel liegt jedoch wie in den anderen Browsern bei 2 27 Zeichen.

Der Test funktionierte in IE8 und Safari unter iOS nicht, vermutlich aufgrund von Speicherproblemen, die durch den Testcode verursacht wurden.

Kurz gesagt, es ist sicher, lange Eigenschaftsnamen zu verwenden, selbst wenn es extrem ist. Solange sich die Zeichenfolgen selbst innerhalb der Grenzen der Browser befinden, können Sie sie auch als Eigenschaftsnamen verwenden.

Hashwechsel
quelle
17
Gibt es eine Laufzeitstrafe für lange Schlüssel in modernen Browsern?
Ahmed Fasih
@AhmedFasih Ich habe es nicht getestet, daher weiß ich es nicht genau. Wenn es einen Leistungsverlust gibt, würde ich annehmen, dass dies mit dem Vergleich langer Zeichenfolgen zu tun hat. Es würde mich wundern, wenn es Probleme gibt, die in der Praxis von Bedeutung sind - es sei denn, die Tasten sind riesig und zahlreich und Sie stoßen auf Speicherbeschränkungen, z. B. auf Mobilgeräten.
Hashchange
7
Die ES7-Spezifikation gibt eine Grenze von 2 ^ 53 - 1 für "Elemente" an . Aber ich denke, es ist durch die maximale Größe des Haufens begrenzt
Mems
6
" MDN schweigt zu diesem Thema ... ". Nicht mehr . ;-)
RobG
2
Die tatsächlichen Größen betragen also 2 ^ 27 = 0,125 GB und 2 ^ 30 = 1 GB. Das ist genug für mich :)
Sorin C
34

Nein, die Zeichenfolgenlänge ist unbegrenzt (solange sie in den Speicher passt), und Ihre Implementierung scheint ebenfalls in Ordnung zu sein. Es ist akut üblich, dass diese "umgedrehten" Arrays z. B. boolesche Werte haben. Und zu den Zeichenfolgen als Schlüssel: Die Zeichenfolgen sind unveränderliche Symbole, die an einer bestimmten Adresse gespeichert sind. Als Index für das Array wird tatsächlich diese Adresse (auch als Zeiger oder Referenz bezeichnet) und nicht die Zeichenfolge selbst verwendet.

Lächerlich
quelle
7
"Die Saiten sind unveränderliche Symbole": Wo haben Sie das gelernt?
Andrew
4
Interessant. Können Sie vielleicht eine Referenz oder Quelle hinzufügen?
Hashchange
8
In vielen Sprachen sind Zeichenfolgen unveränderlich. Javascript ist eine dieser Sprachen. developer.mozilla.org/en-US/docs/Web/JavaScript/…
hartz89
3
nur um ein wenig Klarheit für andere hinzuzufügen. Dies bedeutet, dass Sie keine Aktion ausführen können, die eine Zeichenfolge ändert. Sie können eine neue Zeichenfolge manipulieren und zurückgeben, aber niemals eine ändern
Patrick
Die akzeptierte Antwort ist praktischer, aber dies ist die wahre Antwort.
theUtherSide
5

Mit ECMAScript 2016 scheint es nun eine endgültige Antwort auf diese Frage zu geben. Laut den MDN-Webdokumenten auf string.length :

ECMAScript 2016 (ed. 7) hat eine maximale Länge von 2 ^ 53 - 1 Elementen festgelegt. Bisher wurde keine maximale Länge angegeben.

Sie finden dies auch in der ECMAScript® 2016-Sprachspezifikation :

Der String-Typ ist die Menge aller geordneten Sequenzen von null oder mehr vorzeichenlosen 16-Bit-Ganzzahlwerten („Elementen“) bis zu einer maximalen Länge von 2 53 -1 Elementen.

Francis Bartkowiak
quelle