为什么我可以在javascript中更改常量对象

2022-08-30 01:42:26

我知道ES6还没有标准化,但是目前很多浏览器都支持JS中的关键字。const

在规范中,它写道:

常量的值不能通过重新赋值进行更改,也不能通过重新声明常量。因此,尽管可以在不初始化常量的情况下声明常量,但这样做是无用的。

当我做这样的事情时:

const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];

我看到一切都很好:仍然和.xxx6yyy[]

但是如果我这样做,我的常数数组已经改变了。现在它是,顺便说一句,我仍然无法用.yyy.push(6); yyy.push(1); [6, 1]yyy = 1;

这是一个错误,还是我错过了什么?我在最新的chrome和FF29中尝试过


答案 1

文档指出:

...常量不能通过重新赋值进行更改
...无法重新声明常量

当您添加到数组或对象时,您没有重新分配或重新声明常量,它已经声明和分配,您只是添加到常量指向的“列表”中。

所以这工作正常:

const x = {};

x.foo = 'bar';

console.log(x); // {foo : 'bar'}

x.foo = 'bar2';

console.log(x); // {foo : 'bar2'}  

和这个:

const y = [];

y.push('foo');

console.log(y); // ['foo']

y.unshift("foo2");

console.log(y); // ['foo2', 'foo']

y.pop();

console.log(y); // ['foo2']

但这些都不是:

const x = {};
x = {foo: 'bar'}; // error - re-assigning

const y = ['foo'];
const y = ['bar']; // error - re-declaring

const foo = 'bar'; 
foo = 'bar2';       // error - can not re-assign
var foo = 'bar3';   // error - already declared
function foo() {};  // error - already declared

答案 2

发生这种情况是因为您的常量实际上存储了对数组的引用。当您将某些内容加入数组时,您不是在修改常量值,而是在修改它所指向的数组。如果将对象分配给常量并尝试修改它的任何属性,也会发生同样的情况。

如果要冻结数组或对象,使其无法被修改,可以使用 Object.freeze 方法,该方法已经是 ECMAScript 5 的一部分。

const x = Object.freeze(['a'])
x.push('b')
console.log(x) // ["a"]