JavaScript ES6 'const a = {}' 是可变的.为什么
JavaScript ES6 `const a = {}` is mutable. Why?
使用 JavaScript ES6,我很惊讶地发现:
const a = {};
a.foo = 'bar';
a.foo = 'car';
有效。这是为什么呢?我本以为const
这意味着您无法更改a
空对象并应用新属性。更进一步,我还假设一旦设置了 a
的属性的值,就无法更改它。
只有变量赋值是常量。引用的任何对象或数组都保持可变。
const a = {one: 1};
a.three = 3; // this is ok.
a = {two: 2}; // this doesn't work.
您可以做的是使用Object.freeze
:
const a = {one: 1};
Object.freeze(a);
a.three = 3; // silently fails.
// a is still {one: 1} here.
不,const a
表示您无法更改变量的值 a
。其值始终是相同的对象;更改对象的属性不会使其成为其他对象。
打个比方,无论是amadan.jacket = null
还是amadan.jacket = "Heavy Winter Jacket"
,我都是一样的Person
. amadan
是恒定的。
要使属性不可变,您必须通过 writable: false
将属性显式设置为只读,或者使用 Object.freeze
或 Object.seal
(差异)使整个对象不可变。
相关文章:
- 为什么ES6 Fiddle没有't覆盖命名参数
- 为什么javascript ES6 Promises在解析后继续执行
- 为什么ES6 WeakMap's不可枚举
- 为什么我需要的库没有从ES6转换到ES5
- 为什么我们必须在es6箭头函数中用括号包装throw
- 为什么在ES6-react类中需要绑定
- ES6模块:为什么先前导出的模块不为“;“孩子”;模块
- 为什么Chrome无法(或can)在ES6的Arrow函数中找到上下文
- 节点要求()与ES6导入:为什么这个例子不起作用
- 为什么ES6类没有吊装
- JavaScript ES6 'const a = {}' 是可变的.为什么
- 为什么我必须添加尾部'提供商'到服务名称,当我使用es6时
- 为什么我的webpack配置的es6版本会给我一个错误,而es5版本却没有;t
- 使用带有WebPack的ES6模块,为什么还需要
- 为什么在这种情况下调用 ES6 时“产生”是一个保留字
- 为什么我'm得到&;undefined不是函数&;在下面的ES6 for循环中
- 为什么ES6's映射.forEach迭代'value, key'而不是'key, val
- 为什么浏览器需要一个polyfills文件,而我用babel编译ES6到ES5
- 为什么javascript's ES6/Harmony Set对象为键/值/条目方法返回空对象?
- 为什么ES6 IIFE和ES5 IIFE的执行上下文不同