Javascript 为什么常量字段不受保护?

Javascript 为什么常量字段不受保护?,javascript,constants,ecmascript-6,Javascript,Constants,Ecmascript 6,const可用于声明常量: > const a = 42 undefined > a = 7 7 > a 42 这很酷,但我注意到当使用const声明对象时,这种行为不再有效: > const b = { foo: { bar: 42 }, baz: 7 } undefined > b.baz = { hello: "world" } { hello: 'world' } > b.foo.bar = 7 7 > b { foo: { bar: 7 },

const
可用于声明常量:

> const a = 42
undefined
> a = 7
7
> a
42
这很酷,但我注意到当使用
const
声明对象时,这种行为不再有效:

> const b = { foo: { bar: 42 }, baz: 7 }
undefined
> b.baz = { hello: "world" }
{ hello: 'world' }
> b.foo.bar = 7
7
> b
{ foo: { bar: 7 }, baz: { hello: 'world' } }
如您所见,我将
baz
字段修改为对象,并将
42
更改为
7

阅读《我看到这是预期的》:

然而,为什么这样工作?背后的逻辑是什么

另一方面,问题是:如何声明常量对象

然而,为什么这样工作?背后的逻辑是什么

const
仅将绑定声明为常量。它不会自动使初始化的每个值都不可变

如何声明常量对象

要防止对象发生变异,可以执行以下操作:


const只是阻止了var的重新声明,您似乎想要的是一个不可变的对象,而普通的js对象不是-也许这个()const只是阻止了var的重新声明-但是如果我重写了常量,值就不会被修改。只有通过修改子字段,值才会改变。@IonicăBizău否,对象的“值”是其内存地址。是的,如果“覆盖”表示“为变量赋值”;然后不能为常量变量分配后续值。这是一件事。但是对一个可变值(即对象)进行变异——即使它被分配到常数——也会对它进行变异。至少我是这样理解的。@birdspider如果你愿意,就贴一个答案。:)
// Overwriting the object fails as above (in Firefox and Chrome
but not in Safari)
MY_OBJECT = {"OTHER_KEY": "value"};

// However, object attributes are not protected,
// so the following statement is executed without problems
MY_OBJECT.key = "otherValue";
"use strict";
const b = Object.freeze({foo: Object.freeze({bar: 42}), baz: 7});
b.baz = {hello: "world"}; // Error: Invalid assignment in strict mode