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
。
阅读docs我看到了这一点:
// 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";
但是,为什么这样做呢?背后的逻辑是什么?
另一方面,问题是:如何声明常量对象?
答案 0 :(得分:2)
但是,为什么这样做呢?背后的逻辑是什么?
const
仅将绑定声明为常量。它不会自动生成使用不可变初始化的每个值。
如何声明常量对象?
为了防止对象发生变异,你可以Object.freeze
:
"use strict";
const b = Object.freeze({foo: Object.freeze({bar: 42}), baz: 7});
b.baz = {hello: "world"}; // Error: Invalid assignment in strict mode