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

新手上路,请多包涵

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

在规范中,写道:

常量的值不能通过重新赋值而改变,并且常量不能重新声明。正因为如此,虽然声明一个常量而不初始化它是可能的,但这样做是没有用的。

当我做这样的事情时:

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

我看到一切都还可以: xxx 6 yyy []

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

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

原文由 Salvador Dali 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 365
2 个回答

文件指出:

…常数不能通过重新分配改变

…常量不能重新声明

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

所以这很好用:

 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

原文由 adeneo 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

如果你想冻结一个数组或对象使其不能被修改,你可以使用 Object.freeze 方法,它已经是 ECMAScript 5 的一部分。

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

原文由 Guilherme Sehn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题