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

2022-01-23 00:00:00 constants javascript ecmascript-6

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

I know that ES6 is not standardized yet, but a lot of browsers currently support const keyword in JS.

在规范中是这样写的:

常量的值不能通过重新赋值来改变,并且常量不能重新声明.正因为如此,虽然是可以在不初始化的情况下声明一个常量,它将是这样做没用.

The value of a constant cannot change through re-assignment, and a constant cannot be re-declared. Because of this, although it is possible to declare a constant without initializing it, it would be useless to do so.

当我做这样的事情时:

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

我看到一切正常 xxx 仍然是 6yyy[].

I see that everything is ok xxx is still 6 and yyy is [].

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

But if I do yyy.push(6); yyy.push(1);, my constant array has been changed. Right now it is [6, 1] and by the way I still can not change it with yyy = 1;.

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

I this a bug, or am I missing something? I tried it in the latest chrome and FF29

推荐答案

文档说明:

...常数不能通过重新赋值来改变
...常量不能重新声明

...constant cannot change through re-assignment
...constant cannot be re-declared

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

When you're adding to an array or object you're not re-assigning or re-declaring the constant, it's already declared and assigned, you're just adding to the "list" that the constant points to.

所以这很好用:

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

相关文章