Object.freeze()vs const
Object.freeze()
看起来像是在ES6中使用const
的过渡便利方法。
有没有在代码中占据他们的位置的情况,还是有一种首选的方式来处理不可变数据?
我应该使用Object.freeze()
直到所有浏览器支持const
然后切换到使用const
?
const
和Object.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。