C'è un limite alla lunghezza della chiave (stringa) nell'oggetto JS?


85

Quindi abbiamo avuto un caso in cui avremmo avuto un oggetto, dove la chiave è id (int) e il valore è la stringa. Ma abbiamo notato che la maggior parte delle volte cerchiamo id in base alla stringa, quindi abbiamo deciso di invertirlo e rendere una stringa la chiave e il valore è l'id. Perché in questo modo invece di esaminare ogni elemento e confrontare i valori, potremmo semplicemente farlo var id = storage[text];. Di seguito sono riportati gli esempi di ciò che abbiamo fatto.

Ecco l'esempio della vecchia implementazione:

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

Ecco l'esempio della nuova implementazione:

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

Capisco che ora la stringa è la chiave e va bene ottenere lo stesso ID per le stesse stringhe. Ma dal momento che la stringa può essere potenzialmente piuttosto grande (poche possibilità, ma probabilmente max 1KB per stringa), c'è un limite di lunghezza che JS o Android webview mette sulle chiavi dell'oggetto?

Inoltre, questa implementazione presenta degli svantaggi? Finora non ho notato alcun problema, ma non si sa mai.

Risposte:


98

Ho studiato un po 'questo.

MDN tace sulla questione, così come le specifiche ( ES5 , ES6 ). Affermano solo che la funzione di accesso alla proprietà deve essere una stringa, senza alcuna qualifica, in altre parole, non ci sono limiti per quanto riguarda le specifiche. Non è affatto sorprendente.

Il modo in cui i browser lo gestiscono è un'altra questione. Ho impostato un test e l'ho eseguito in diversi browser. Chrome 40 (desktop), Chrome 40 (Android 5.1), Firefox 36, Opera 27 e IE9 + possono gestire un nome di proprietà fino a 2 27 caratteri. Safari 8 (OS X Yosemite) può persino gestire nomi di proprietà di 2 30 caratteri.

Per tutti quei browser eccetto IE, la lunghezza massima della proprietà è uguale alla lunghezza massima della stringa. IE9 + può gestire una lunghezza massima di stringa di ~ 2 30 caratteri, ma il limite per le chiavi degli oggetti è di 2 27 caratteri, proprio come negli altri browser.

Il test non ha funzionato in IE8 e Safari su iOS, presumibilmente a causa di problemi di memoria causati dal codice del test.

In poche parole, è sicuro usare nomi di proprietà lunghi, anche quando li si porta agli estremi. Finché le stringhe stesse restano entro i limiti di ciò che i browser possono gestire, puoi usarle anche come nomi di proprietà.


18
Qualche penalità di runtime per le chiavi lunghe sui browser moderni?
Ahmed Fasih

@AhmedFasih Non l'ho provato, quindi non lo so per certo. Se c'è una penalità nelle prestazioni, presumo che abbia a che fare con il confronto di stringhe lunghe. Sarei sorpreso se ci fossero problemi che contano nella pratica, a meno che i tasti non siano enormi e numerosi e non inizi a colpire i limiti di memoria, ad esempio sui dispositivi mobili.
cambio hash

7
Le specifiche ES7 specificano un limite di 2 ^ 53 - 1 di "elementi" . Ma penso che sia limitato dalla dimensione massima dell'heap
meme

6
" MDN tace sulla questione… ". Non più . ;-)
RobG

3
Quindi le dimensioni effettive sono 2 ^ 27 = 0,125 GB e 2 ^ 30 = 1 GB. È abbastanza per me :)
Sorin C

34

No, non ci sono limiti per la lunghezza della stringa (purché si adatti alla memoria), e anche la tua implementazione sembra a posto. È abbastanza comune avere quegli array "invertiti" con valori booleani. E per quanto riguarda le stringhe come chiavi: le stringhe sono simboli immutabili che vengono memorizzati a un certo indirizzo e ciò che viene effettivamente utilizzato come indice per l'array è quell'indirizzo (noto anche come puntatore o riferimento) e non la stringa stessa.


7
"Le corde sono simboli immutabili": Dove l'hai imparato?
Andrew

4
Interessante. Puoi forse aggiungere un riferimento o una fonte?
cambio hash

8
In molte lingue, le stringhe sono immutabili. Javascript è una di quelle lingue. developer.mozilla.org/en-US/docs/Web/JavaScript/…
hartz89

3
solo per aggiungere un po 'di chiarezza minore per altri. ciò significa che non è possibile eseguire un'azione che modifica una stringa. puoi manipolare e restituire una nuova stringa, ma non cambiarne mai una
Patrick

La risposta accettata è più pratica, ma questa è la vera risposta.
theUtherSide

6

Sembra che con ECMAScript 2016, ora ci sia una risposta definitiva a questa domanda. Secondo MDN Web Docs su string.length :

ECMAScript 2016 (ed. 7) ha stabilito una lunghezza massima di 2 ^ 53 - 1 elementi. In precedenza, non era specificata alcuna lunghezza massima.

Puoi anche trovare questo specificato nella specifica della lingua ECMAScript® 2016 :

Il tipo String è l'insieme di tutte le sequenze ordinate di zero o più 16 bit valori interi senza segno ( “elementi”) fino ad una lunghezza massima di 2 53 -1 elementi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.