Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

147
Vistas
¿Qué parte de la especificación ECMAScript exige que el tipo String sea inmutable?

Sé que el tipo primitivo String en Javascript es inmutable, a través de la práctica y el boca a boca. Pero, ¿qué combinación de reglas en el ECMA-262 lo hace así? Más específicamente, ¿por qué la segunda línea del siguiente ejemplo silenciosamente no hace nada?

 const str = 'abc'; str[1] = '8'; console.log(str); // prints unmodified "abc", not "a8c".

La Sección 6.1.4 describe la composición interna de String datum. No contiene nada sobre la modificación de los datos, o al menos no pude encontrar nada después de leerlo tres veces.

La Sección 13.15.2 describe la semántica de la asignación. No contiene ninguna excepción para ningún tipo de datos específico.

La sección 13.3.2.1 describe la semántica del operador de acceso a la propiedad. No contiene ninguna excepción para ningún tipo de datos específico.

Entonces, ¿cómo se define exactamente el tipo de datos de cadena para que sea inmutable en Javascript?

about 4 years ago · Santiago Gelvez
2 Respuestas
Responde la pregunta

0

La especificación EMCAScript no dice nada sobre esto, al igual que no dice nada sobre la identidad del objeto (es decir, la mutabilidad del objeto). Entonces, sí, se trata más de " a través de la práctica y el boca a boca ", pero supongo que una implementación conforme podría cambiar la representación de memoria de una cadena en segundo plano (o incluso proporcionar una API para hacerlo como una extensión).

Sin embargo, puede inferir la inmutabilidad de las cadenas a partir de la redacción de §6.1.4 " El tipo de cadena " que vinculó:

El tipo String 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.

Esta es una definición muy matemática, y en matemáticas, los valores son siempre inmutables. Además, podemos observar que simplemente no hay ninguna operación dentro de ECMAScript que pueda mutar dicho valor.

Sin embargo, la definición se aplica solo a los valores primitivos, no a los objetos String que envuelven dicho valor y pueden tener propiedades adicionales (mutables). Nuevamente, simplemente no hay ninguna operación que cambie la ranura interna [[StringData]] de una instancia de String . Esto incluso se describe explícitamente en la sección sobre String Exotic Objects :

Un objeto String es un objeto exótico que encapsula un valor String y expone propiedades de datos indexados con enteros virtuales correspondientes a los elementos de unidad de código individuales del valor String. Los objetos exóticos de cadena siempre tienen una propiedad de datos llamada "length" cuyo valor es el número de elementos de unidad de código en el valor de cadena encapsulado. Tanto las propiedades de datos de la unidad de código como la propiedad de "length" no se pueden escribir ni configurar.

Esto también es lo que observa en su código de ejemplo. La asignación str[1] = … va al método interno [[DefineOwnProperty]] de String , que encuentra que la propiedad 1 no se puede escribir, rechazando un cambio. La operación abstracta PutValue lanzará una excepción en modo estricto (o ignorará la falla en modo descuidado).

about 4 years ago · Santiago Gelvez Denunciar

0

Editar: creo que mi respuesta original era tan incorrecta que es posible que no se pueda canjear en absoluto, pero dado que hay una excelente respuesta, no quiero eliminarla por completo. Intentaré arreglarlo.

Estaba tratando de decir que en el lado izquierdo de una tarea solo hay dos opciones para [ ] , acceso a objetos por clave y desestructuración. Las cadenas son objetos sin claves para cada índice en el valor del texto. Una expresión de desestructuración tampoco encaja, e incluso entonces sería una nueva expresión (valor) de undefined y, por lo tanto, no modificaría la cadena original. Esta puede ser la razón por la que no hay ningún error, pero parece que no hace nada. Modifica un valor (temporal) de una expresión que no está almacenada en ningún lado.

La sección 10.4.3.5 del estándar podría ser lo más parecido a identificar la regla, diciendo que el resultado es [[Writable]]: false , pero dado que sigue siendo una expresión, representa un valor que aún se puede asignar a algo, incluso aunque ese valor será descartado si no.

Curiosamente, let B = 'abc'[1] = 'B' asignaría 'B' a B como se esperaba, pero no modificaría la cadena, independientemente de si era una cadena constante o variable. Y así let A='abc'; let B = A[1] = 'B' tiene el mismo efecto. Entonces, nuevamente, debido a que es un tipo básico sin claves para [1] en este caso, la nueva expresión es más un valor nuevo que apuntar a la memoria original donde se almacena la cadena.

Aún más interesante: let B = undefined = 'B' asigna con éxito 'B' a B. No estoy muy seguro de cómo, pero creo que es el mismo caso que {}[1] aunque undefined es un valor real que podría haberse asignado a B. Creo que esto significa que hay una excepción para un valor intermedio en una secuencia de asignaciones si se evalúa como undefined y no pasa el undefined a la siguiente expresión de la izquierda.

Creo que es el mismo caso que undefined = 'B' que no hace nada, pero ese valor en el lado izquierdo sigue siendo 'B' , si está asignado en alguna parte. Puedo predecir que llamar a func(undefined = 3) de hecho pasará un 3 a la función.


Respuesta original: estaba tan equivocado que lo eliminé ahora. Gracias a @hijarian por despertarme con su comentario sobre el operador [ ] .

about 4 years ago · Santiago Gelvez Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda