Object.freeze()vs const

Object.freeze()看起来像是在ES6中使用const的过渡便利方法。

有没有在代码中占据他们的位置的情况,还是有一种首选的方式来处理不可变数据?

我应该使用Object.freeze()直到所有浏览器支持const然后切换到使用const

constObject.freeze是两个完全不同的东西。

const适用于绑定 (“variables”)。 它创build一个不可变的绑定,即你不能给绑定分配一个新的值。

Object.freeze工作在 ,更具体地说, 对象值 。 它使一个对象不可变,即你不能改变它的属性。

在ES5中, Object.freeze在基元上不起作用,这可能比使用const更常用的对象声明。 你可以在ES6中冻结原语,但是你也可以支持const

另一方面, const用来声明对象不会“冻结”它们,你不能重新声明整个对象,但你可以自由地修改它的键。 另一方面,你可以重新声明冻结的对象。

Object.freeze也很浅,所以你需要recursion地将它应用到嵌套对象上来保护它们。

 var ob1 = { foo : 1, bar : { value : 2 } }; Object.freeze( ob1 ); const ob2 = { foo : 1, bar : { value : 2 } } ob1.foo = 4; // (frozen) ob1.foo not modified ob2.foo = 4; // (const) ob2.foo modified ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested ob2.bar.value = 4; // (const) modified ob1.bar = 4; // (frozen) not modified, bar is a key of obj1 ob2.bar = 4; // (const) modified ob1 = {}; // (frozen) ob1 redeclared ob2 = {}; // (const) ob2 not redeclared 
 var obj = { a: 1, b: 2 }; Object.freeze(obj); obj.newField = 3; // You can't assign new field , or change current fields 

上面的例子完全让你的对象不可变。

让我们看下面的例子。

 const obj = { a: 1, b: 2 }; obj.a = 13; // You can change a field obj.newField = 3; // You can assign new field. 

它不会给任何错误。

但是,如果你这样尝试

 const obj = { a: 1, b: 2 }; obj = { t:4 }; 

它会抛出这样的错误“obj是只读的”。

另一个用例

 const obj = {a:1}; var obj = 3; 

它会抛出Duplicate declaration "obj"

另外根据mozilla文档const解释

const声明为一个值创build一个只读引用。 这并不意味着它所拥有的价值是不可变的 ,只是variables标识符不能被重新分配。

这个例子根据babeljs ES6特性创build。