Significa que una vez que crea una instancia del objeto, no puede cambiar sus propiedades. En tu primera alerta no estás cambiando de foo. Estás creando una nueva cadena. Es por eso que en su segunda alerta mostrará "foo" en lugar de oo.
¿Significa que, al llamar a métodos en una cadena, devolverá la cadena modificada, pero no cambiará la cadena inicial?
Si. Nada puede cambiar la cadena una vez creada. Ahora bien, esto no significa que no pueda asignar un nuevo objeto de cadena a la str
variable. Simplemente no puede cambiar el objeto actual al que hace referencia str.
Si la cadena fuera mutable, ¿eso significa que la segunda alerta () también devolvería oo?
Técnicamente, no, porque el método de subcadena devuelve una nueva cadena. Hacer que un objeto sea mutable, no cambiaría el método. Hacerlo mutable significa que, técnicamente, podría hacerlo de modo que la subcadena cambie la cadena original en lugar de crear una nueva.
En un nivel inferior, la inmutabilidad significa que la memoria en la que se almacena la cadena no se modificará. Una vez que crea una cadena
"foo"
, se asigna algo de memoria para almacenar el valor"foo"
. Esta memoria no se verá alterada. Si modifica la cadena con, digamossubstr(1)
,, se crea una nueva cadena y se asigna una parte diferente de la memoria que se almacenará"oo"
. Ahora tiene dos cadenas en la memoria"foo"
y"oo"
. Incluso si no va a usar"foo"
más, se quedará hasta que se recoja la basura.Una de las razones por las que las operaciones con cadenas son comparativamente caras.
fuente
Inmutable significa aquello que no se puede cambiar ni modificar.
Entonces, cuando asigna un valor a una cadena, este valor se crea desde cero en lugar de ser reemplazado. Entonces, cada vez que se asigna un nuevo valor a la misma cadena, se crea una copia. Entonces, en realidad, nunca cambiará el valor original.
fuente
No estoy seguro acerca de JavaScript, pero en Java, las cadenas dan un paso adicional hacia la inmutabilidad, con el "String Constant Pool". Las cadenas se pueden construir con cadenas literales (
"foo"
) o con unString
constructor de clases. Las cadenas construidas con literales de cadena son parte del Grupo de constantes de cadena, y el mismo literal de cadena siempre será la misma dirección de memoria del grupo.Ejemplo:
En lo anterior, ambos
lit1
ylit2
se construyen usando el mismo literal de cadena, por lo que apuntan a la misma dirección de memoria;lit1 == lit2
da como resultadotrue
, porque son exactamente el mismo objeto.Sin embargo,
cons
se construye utilizando el constructor de clases. Aunque el parámetro es la misma constante de cadena, el constructor asigna nueva memoria paracons
, lo que significacons
que no es el mismo objeto quelit1
ylit2
, a pesar de contener los mismos datos.Por supuesto, dado que las tres cadenas contienen los mismos datos de caracteres, el uso del
equals
método devolverá verdadero.(Ambos tipos de construcción de cuerdas son inmutables, por supuesto)
fuente
Inmutable significa que el valor no se puede cambiar. Una vez creado, un objeto de cadena no se puede modificar porque es inmutable. Si solicita una subcadena de una cadena, se crea una nueva cadena con la parte solicitada.
El uso de StringBuffer mientras se manipula Strings hace que la operación sea más eficiente, ya que StringBuffer almacena la cadena en una matriz de caracteres con variables para contener la capacidad de la matriz de caracteres y la longitud de la matriz (String en una forma de matriz de caracteres)
fuente
La definición del libro de texto de mutabilidad es susceptible o sujeta a cambios o alteraciones. En programación, usamos la palabra para referirnos a objetos cuyo estado puede cambiar con el tiempo. Un valor inmutable es exactamente lo contrario: una vez creado, nunca puede cambiar.
Si esto te parece extraño, permíteme recordarte que muchos de los valores que usamos todo el tiempo son de hecho inmutables.
Creo que nadie se sorprenderá al saber que la segunda línea no cambia de ninguna manera la cadena en la declaración. De hecho, ningún método de cadena cambia la cadena en la que operan, todos devuelven cadenas nuevas. La razón es que las cadenas son inmutables: no pueden cambiar, solo podemos crear nuevas cadenas.
Las cadenas no son los únicos valores inmutables integrados en JavaScript. Los números también son inmutables. ¿Puedes siquiera imaginar un entorno en el que evaluar la expresión 2 + 3 cambie el significado del número 2? Suena absurdo, pero hacemos esto con nuestros objetos y matrices todo el tiempo.
fuente
De cadenas a pilas ... un ejemplo sencillo de entender tomado del blog de Eric Lippert :
Búsqueda de ruta con A * en C # 3.0, segunda parte ...
Para profundizar en la comprensión de la inmutabilidad, lea las publicaciones de Eric que comienzan con esta:
Inmutabilidad en C # Parte uno: tipos de inmutabilidad
fuente
Una forma de comprender este concepto es observar cómo javascript trata todos los objetos, que es por referencia. Lo que significa que todos los objetos son mutables después de ser instanciados, esto significa que puede agregar un objeto con nuevos métodos y propiedades. Esto es importante porque si desea que un objeto sea inmutable, el objeto no puede cambiar después de ser instanciado.
fuente