¿Las implementaciones comunes de JavaScript utilizan internación de cadenas?
¿Los motores de JavaScript comunes, como V8 y JavaScriptCore de WebKit, utilizan internación de cadenas para cadenas de JavaScript? ¿O en realidad mantienen múltiples instancias de cadenas idénticas en la memoria?
Sí. En general, se interna cualquier cadena literal, identificador u otra cadena constante en la fuente JS. Sin embargo, los detalles de implementación (exactamente qué se realiza la pasantía, por ejemplo) varían, así como el momento en que se realiza la pasantía.
Tenga en cuenta que un valor de cadena no es lo mismo que un objeto de cadena. Sin embargo, los objetos de cadena no se internan porque eso sería un comportamiento fundamentalmente incorrecto.
http://jsperf.com/strinterning
¡Sí en Chrome, no en Aurora 15 y FF 13! Comparar dos cadenas es un 85% más lento que comparar dos punteros en Firefox. Sin embargo, es la misma velocidad en Chrome, lo que es una indicación de que está comparando dos punteros.
Quizás el equipo del motor JS de Mozilla debería comprobar su código...
Respuesta corta: a veces sí, a veces no.
También me topé con la misma pregunta y la investigué un poco. Parece que la pasantía se realiza generalmente para cadenas literales que se generan de la misma manera (por ejemplo, siempre asignando la misma cadena a una variable en el mismo bucle), PERO también pude crear un ejemplo que da como resultado la creación de dos cadenas idénticas. con dos referencias diferentes:
Como puede ver, cada cadena se almacena dos veces y tiene referencias diferentes.
Este es el código que utilicé para generar las cadenas duplicadas:
const a = [];
const b = [];
for(let j =1; j<= 100;++j){
for(let i = 1; i <= 10000; ++i) a[i] = 'player 1 got 5 points from player 2' + i;
for(let i = 1; i <= 10000; ++i) b[i] = 'player 1 got 5 points from player 2' + i;
}
Parece que la internación de cadenas se realiza para cadenas literales, pero no para valores de cadenas concatenadas, pero como puede ver arriba, cada cadena concatenada solo aparece dos veces, no 100x2 = 200 veces, por lo que todavía se realiza internación de cadenas para cadenas concatenadas creadas en el bucle exterior.