为什么常数字段不受保护?

时间:2015-08-05 12:37:09

标签: 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 }, 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";

但是,为什么这样做呢?背后的逻辑是什么?

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

1 个答案:

答案 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