Sé que ES6 aún no está estandarizado, pero muchos navegadores actualmente admiten const
palabras clave en JS.
En las especificaciones, está escrito que:
El valor de una constante no puede cambiar mediante la reasignación y una constante no se puede volver a declarar. Por ello, aunque es posible declarar una constante sin inicializarla, sería inútil hacerlo.
y cuando hago algo como esto:
const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];
Veo que todo está bien, xxx
está quieto 6
y yyy
está []
.
Pero si lo hago yyy.push(6); yyy.push(1);
, mi matriz constante se ha cambiado. Ahora mismo lo es [6, 1]
y por cierto todavía no puedo cambiarlo yyy = 1;
.
¿Es un error o me falta algo? Lo probé en el último Chrome y FF29.
javascript
ecmascript-6
const
Salvador Dalí
fuente
fuente
Respuestas:
La documentación dice:
Cuando está agregando a una matriz u objeto, no está reasignando ni volviendo a declarar la constante, ya está declarada y asignada, solo está agregando a la "lista" a la que apunta la constante.
Entonces esto funciona bien:
y esto:
pero ninguno de estos:
fuente
Esto sucede porque su constante está almacenando una referencia a la matriz. Cuando une algo en su matriz, no está modificando su valor constante, sino la matriz a la que apunta. Lo mismo sucedería si asignara un objeto a una constante e intentara modificar alguna propiedad de la misma.
Si desea congelar una matriz u objeto para que no se pueda modificar, puede usar el
Object.freeze
método, que ya es parte de ECMAScript 5.fuente
five
establecida en 5 en realidad no tiene un valor de 5, es solo una referencia al número 5. Entonces, si lo hago,five++
no estoy cambiando la constante, solo el número al que apunta.five
apunta la variable (la variablefive
solía ser una etiqueta para el número 5, ahora apunta a un número diferente: 6). En el ejemplo de la pregunta (y esta respuesta),x
siempre apunta a la misma lista; six
es constante, no puede hacer que apunte a una lista diferente. La única diferencia es que la misma lista puede crecer o reducirse; esto es algo solo posible para matrices y objetos y no para primitivas.Este es un comportamiento consistente con todos los lenguajes de programación que se me ocurren.
Considere C: las matrices son solo punteros glorificados. Una matriz constante solo significa que el valor del puntero no cambiará, pero de hecho los datos contenidos en esa dirección son gratuitos.
En javascript, se le permite llamar a métodos de objetos constantes (por supuesto, ¡de lo contrario los objetos constantes no servirían de mucho!). Estos métodos pueden tener el efecto secundario de modificar el objeto. Dado que las matrices en javascript son objetos, este comportamiento también se aplica a ellas.
Todo lo que está seguro es que la constante siempre apuntará al mismo objeto. Las propiedades del objeto en sí pueden cambiar libremente.
fuente
Además, una nota también importante:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
fuente
Creo que esto le dará más claridad sobre el tema: https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0 .
Básicamente, se reduce a que
const
siempre apunta a la misma dirección en la memoria. Puede cambiar el valor almacenado en esa dirección pero no puede cambiar la direcciónconst
que apunta también.La definición de lo
const
que mencionó será cierta cuandoconst
apunte a una dirección que tenga un valor primitivo. Esto se debe a que no puede asignar un valor a estoconst
sin cambiar su dirección (porque así es como funciona la asignación de valores primitivos) yconst
no se permite cambiar la dirección de a .Donde, como si
const
apuntara a un valor no primitivo, es posible editar el valor de la dirección.fuente
Encontré este artículo mientras buscaba por qué pude actualizar un Objeto incluso después de definirlo como
const
. Entonces, el punto aquí es que no es el Objeto directamente sino los atributos que contiene los que pueden actualizarse.Por ejemplo, mi Objeto se ve así:
Las respuestas anteriores señalaron correctamente que es el Objeto el que es constante y no su atributo. Por lo tanto, podré actualizar la identificación o el nombre haciendo:
Pero, no podré actualizar el Objeto en sí como:
fuente
Porque en const puedes cambiar los valores de un objeto, por lo que el objeto no almacena los datos de la asignación, sino que los apunta. por lo que hay una diferencia entre primitivas y objetos en Javascript.
fuente