2010-07-08 15 views
92

Si una cadena es inmutable, ¿significa eso .... (vamos a suponer JavaScript)¿Qué significa inmutable?

var str = 'foo'; 

alert(str.substr(1)); // oo 

alert(str); // foo 

¿Quiere decir, cuando se llama a métodos de un collar, devolverá la cadena modificada, pero ganaron ¿Cambiar la cadena inicial?

Si la cadena era mutable, ¿significa eso que la 2da alert() devolvería oo también?

Respuesta

100

Significa que una vez que crea una instancia del objeto, no puede cambiar sus propiedades. En su primera alerta, no está cambiando foo. Estás creando una nueva cadena. Es por eso que en su segunda alerta mostrará "foo" en lugar de oo.

¿Quiere decir, al llamar a métodos en una cadena, se devolverá el cadena modificada, pero no va a cambiar la cadena inicial ?

Sí. Nada puede cambiar la cadena una vez que se ha creado. Ahora, esto no significa que no pueda asignar un nuevo objeto de cadena a la variable str. Simplemente no puede cambiar el objeto actual al que hace referencia str.

Si la cadena era mutable, ¿eso quiere decir la segunda alerta() retornaría oo así?

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.

+0

La misma cadena, si se modifica y asigna, actualizará la cadena var str = 'foo'; str = str.substr (1)); // oo alert (str); // oo –

+0

¿Qué pasa con el siguiente código. El valor de cadena se cambia ahora. var name = "Santosh"; console.log (name.substr (0,2)); var name = "kumar" console.log (nombre); Cómo es aún inmutable – Santosh

12

Inmutables significa que no se pueden cambiar ni modificar.

Así que cuando asigna un valor a una cadena, este valor se crea desde cero en lugar de reemplazarse. Por lo tanto, cada vez que se asigna un nuevo valor a la misma cadena, se crea una copia. Entonces, en realidad, nunca cambias el valor original.

2

De las cadenas de pilas ... un sencillo de entender ejemplo tomado de Eric Lippert's blog:

Path Finding Using A* in C# 3.0, Part Two ...

Una pila mutable como System.Collections.Generic.Stack claramente no es adecuado . Queremos ser capaces de tomar una ruta existente y crear nuevas rutas para todos los vecinos de su último elemento, , pero presionar un nuevo nodo en la pila estándar modifica la pila. Tendríamos que hacer copias de la pila antes de presionarlo, lo cual es absurdo porque entonces estaríamos duplicando todos los de su contenido innecesariamente.

Las pilas inmutables no tienen este problema. Al presionar sobre una pila inmutable , simplemente se crea una nueva pila que enlaza con la anterior como su cola .Dado que la pila es inmutable, no hay peligro de que aparezca algún otro código y se meta con el contenido de la cola . Puede seguir utilizando la pila antigua para su corazón.

para profundizar en understaning inmutabilidad, leer mensajes de Eric comenzando con éste:

Immutability in C# Part One: Kinds of Immutability

+0

Esa cita contiene una afirmación extraña: que la estructura de datos de pila (en realidad múltiples pilas con compartimiento de cola) es, como un todo, una estructura mutable, cada impulso o pop cambia la estructura. Solo los artículos individuales son inmutables. Y, en principio, podría tener la misma estructura pero con elementos mutables. Esto sucede en algunas variaciones de union-find IIRC. La inmutabilidad tiene grandes ventajas, pero compartir una parte o la totalidad de una estructura de datos como una optimización es perfectamente posible con mutables. Incluso si desea una inmutabilidad aparente para otras referencias, siempre puede copiar por escrito según sea necesario. – Steve314

86

En un nivel inferior, la inmutabilidad significa que la memoria de la cadena se almacena en no será modificado. Una vez que crea una cadena "foo", se asigna algo de memoria para almacenar el valor "foo". Esta memoria no será alterada. Si modifica la cadena con, por ejemplo, substr(1), se crea una nueva cadena y se asigna una parte diferente de la memoria que almacenará "oo". Ahora tiene dos cadenas en la memoria, "foo" y "oo". Incluso si ya no va a usar "foo", se mantendrá hasta que se recoja la basura.

Una razón por la cual las operaciones de cadena son comparativamente costosas.

+5

+1 gracias, esto es bueno saber – alex

+1

Los números son inmutables también. –

+3

¡hola de 2015! "En un nivel inferior, la inmutabilidad significa que la memoria en la que está almacenada la cadena no se modificará." --- esto es demasiado restrictivo y no suena bien. La inmutabilidad solo tiene que ver con el territorio del usuario, la memoria virtual puede cambiarse a medida que el asignador de memoria le gusta tan pronto como se mantengan las invariantes de especificación del lenguaje. – zerkms

8

No estoy seguro acerca de JavaScript, pero en Java, las cadenas dan un paso adicional a la inmutabilidad, con el "Conjunto constante de cadenas". Las cadenas se pueden construir con literales de cadena ("foo") o con un constructor de clase String. Las cadenas construidas con literales de cadena forman parte del conjunto constante de cadenas, y el mismo literal de cadena siempre será la misma dirección de memoria del grupo.

Ejemplo:

String lit1 = "foo"; 
    String lit2 = "foo"; 
    String cons = new String("foo"); 

    System.out.println(lit1 == lit2);  // true 
    System.out.println(lit1 == cons);  // false 

    System.out.println(lit1.equals(cons)); // true 

En lo anterior, tanto lit1 y lit2 se construyen utilizando la misma cadena literal, por lo que están apuntando a la misma dirección de memoria; lit1 == lit2 resultados en true, porque son exactamente el mismo objeto.

Sin embargo, cons se construye utilizando el constructor de clase. Aunque el parámetro es la misma constante de cadena, el constructor asigna memoria nueva para cons, lo que significa que cons no es el mismo objeto que lit1 y lit2, a pesar de contener los mismos datos.

Por supuesto, dado que las tres cadenas contienen todos los mismos datos de caracteres, utilizando el método equals se devolverá verdadero.

(Ambos tipos de construcción String son inmutables, por supuesto)

3

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.

Usando StringBuffer mientras que la manipulación de cadenas en lugar hace la operación más eficiente como StringBuffer almacena la cadena en una matriz de caracteres con las variables para mantener la capacidad de la matriz de caracteres y la longitud de la matriz (String en una forma matriz de caracteres)

0

Una forma de comprender este concepto es observar cómo javascript trata a todos los objetos, lo que se hace por referencia. Lo que significa que todos los objetos son mutable después de la creación de una instancia, 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 la instancia.

2

La definición de libro de texto de mutabilidad es responsable o está sujeta a cambios o alteraciones. En la programación, utilizamos la palabra para referirnos a objetos cuyo estado puede cambiar con el tiempo. Un valor inmutable es exactamente lo opuesto: una vez creado, nunca cambiará.

Si esto parece extraño, permítanme recordarles que muchos de los valores que usamos todo el tiempo son, de hecho, inmutables.

var statement = "I am an immutable value"; 
var otherStr = statement.slice(8, 17); 

Creo que nadie se sorprenderá al saber que la segunda línea de ninguna manera cambia la cadena en la declaración. De hecho, ningún método de cadena cambia la cadena en la que operan, todos devuelven nuevas cadenas. 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 incorporados en JavaScript. Los números son inmutables también. ¿Puedes imaginar un entorno en el que evaluar la expresión 2 + 3 cambia el significado del número 2? Parece absurdo, pero hacemos esto con nuestros objetos y matrices todo el tiempo.