Object.freeze() vs const

2022-08-30 01:34:48

Object.freeze() 似乎是一种过渡性的便利方法,可以在 ES6 中使用。const

是否存在两者在代码中占据一席之地的情况,或者是否有一种首选方法来处理不可变数据?

我应该使用Object.freeze()直到我使用的所有浏览器都支持然后切换到使用吗?constconst


答案 1

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

const适用于绑定(“变量”)。它创建一个不可变的绑定,即您无法为绑定分配新值。

Object.freeze适用于,更具体地说,适用于对象值。它使对象不可变,即您无法更改其属性。


答案 2

在ES5中,基元不起作用,基元可能比对象更常用。您可以在 ES6 中冻结基元,但同时也可以支持 。Object.freezeconstconst

另一方面,用于声明对象不会“冻结”它们,您只是无法重新声明整个对象,但您可以自由修改其键。另一方面,您可以重新声明冻结的对象。const

Object.freeze也很浅,因此您需要在嵌套对象上递归地应用它来保护它们。

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