¿Existe un límite en la longitud de la clave (cadena) en el objeto JS?

84

Entonces tuvimos un caso en el que tendríamos un objeto, donde la clave es id (int) y el valor es la cadena. Pero notamos que la mayoría de las veces, buscamos id basándonos en la cadena, así que decidimos revertirla y hacer de una cadena la clave y el valor es la id. Porque de esa manera en lugar de revisar cada elemento y comparar valores, podríamos hacerlo var id = storage[text];. A continuación se muestran los ejemplos de lo que hicimos.

Aquí está el ejemplo de la implementación anterior:

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

Aquí está el ejemplo de la nueva implementación:

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

Entiendo que ahora la cadena es la clave y está bien obtener la misma identificación para las mismas cadenas. Pero dado que ahora la cadena puede ser potencialmente bastante grande (posibilidad mínima, pero probablemente un máximo de 1 KB por cadena), ¿hay un límite de longitud que JS o Android webview pone en las claves de objeto?

Y además, ¿esta implementación tiene desventajas? No he notado ningún problema hasta ahora, pero nunca se sabe.

Sherzod
fuente

Respuestas:

96

He investigado esto un poco.

MDN no dice nada sobre el tema, al igual que las especificaciones ( ES5 , ES6 ). Solo establecen que el acceso a la propiedad debe ser una cadena, sin ninguna calificación; en otras palabras, no hay límite en lo que respecta a la especificación. Eso no es de extrañar.

Cómo lo manejan los navegadores, es otro asunto. He configurado una prueba y la ejecuté en varios navegadores. Chrome 40 (escritorio), Chrome 40 (Android 5.1), Firefox 36, Opera 27 e IE9 + pueden manejar un nombre de propiedad de hasta 227 caracteres. Safari 8 (OS X Yosemite) puede incluso manejar nombres de propiedad de 2 30 caracteres.

Para todos esos navegadores excepto IE, la longitud máxima de la propiedad es la misma que la longitud máxima de la cadena. IE9 + puede manejar una longitud máxima de cadena de ~ 2 30 caracteres, pero el límite para claves de objeto es de 2 27 caracteres, al igual que en los otros navegadores.

La prueba no funcionó en IE8 y Safari en iOS, presumiblemente debido a problemas de memoria causados ​​por el código de prueba.

En pocas palabras, es seguro utilizar nombres de propiedad largos, incluso cuando se los lleva a extremos. Siempre que las cadenas se mantengan dentro de los límites de lo que pueden manejar los navegadores, también puede usarlas como nombres de propiedad.

hashchange
fuente
17
¿Alguna penalización de tiempo de ejecución para claves largas en navegadores modernos?
Ahmed Fasih
@AhmedFasih No lo he probado, así que no estoy seguro. Si hay una penalización de rendimiento, supongo que tendría que ver con comparar cadenas largas. Me sorprendería si hay problemas que importan en la práctica, a menos que las teclas sean enormes y numerosas y empiece a tener limitaciones de memoria, por ejemplo, en dispositivos móviles.
hashchange
7
La especificación ES7 especifica un límite de 2 ^ 53 - 1 de "elementos" . Pero creo que está limitado por el tamaño máximo del montón
mems
6
" MDN guarda silencio sobre el tema ... ". Ya no . ;-)
RobG
2
Por tanto, los tamaños reales son 2 ^ 27 = 0,125 GB y 2 ^ 30 = 1 GB. Eso es suficiente para mí :)
Sorin C
34

No, no hay límite para la longitud de la cadena (siempre que quepa en la memoria) y su implementación también parece estar bien. Es realmente bastante común tener esos arreglos 'invertidos' con, por ejemplo, valores booleanos. Y en cuanto a las cadenas como claves: las cadenas son símbolos inmutables que se almacenan en una determinada dirección, y lo que realmente se usa como índice para la matriz es esa dirección (también conocida como puntero, también conocida como referencia) y no la cadena en sí.

Ridcully
fuente
7
"Las cuerdas son símbolos inmutables": ¿Dónde aprendiste esto?
Andrew
4
Interesante. ¿Puede agregar una referencia o fuente?
hashchange
8
En muchos idiomas, las cadenas son inmutables. Javascript es uno de esos lenguajes. developer.mozilla.org/en-US/docs/Web/JavaScript/…
hartz89
3
solo para agregar un poco de claridad para otros. esto significa que no puede realizar una acción que cambie una cadena. puede manipular y devolver una nueva cadena, pero nunca cambiar una
Patrick
La respuesta aceptada es más práctica, pero esta es la respuesta real.
theUtherSide
5

Parece que con ECMAScript 2016, ahora hay una respuesta definitiva a esta pregunta. De acuerdo con MDN Web Docs sobre string.length :

ECMAScript 2016 (ed. 7) estableció una longitud máxima de 2 ^ 53 - 1 elementos. Anteriormente, no se especificó una longitud máxima.

También puede encontrar esto especificado en la Especificación de idioma ECMAScript® 2016 :

El tipo de cadena es el conjunto de todas las secuencias ordenadas de cero o más valores enteros sin signo de 16 bits ("elementos") hasta una longitud máxima de 2 53 -1 elementos.

Francis Bartkowiak
fuente