为什么我可以在javascript中更改常量对象
我知道 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
仍然是 6
而 yyy
是 []
.
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
相关文章