Javascript Object.freeze()vs const
在ES6中使用Javascript Object.freeze()vs const,javascript,ecmascript-6,Javascript,Ecmascript 6,在ES6中使用const似乎是一种过渡性的方便方法 是否存在这样的情况,即两者都在代码中占有一席之地,或者是否有更好的方法来处理不可变数据 我是否应该一直使用支持const的所有浏览器,然后改为使用const呢?在ES5对象中。冻结不适用于原语,与对象相比,使用const可能更常见。您可以在ES6中冻结原语,但也可以支持const 另一方面,用于声明对象的const不会“冻结”它们,只是不能重新声明整个对象,但可以自由修改其关键帧。另一方面,您可以重新声明冻结的对象 Object.freeze也
const
似乎是一种过渡性的方便方法
是否存在这样的情况,即两者都在代码中占有一席之地,或者是否有更好的方法来处理不可变数据
我是否应该一直使用支持
const
的所有浏览器,然后改为使用const
呢?在ES5对象中。冻结不适用于原语,与对象相比,使用const
可能更常见。您可以在ES6中冻结原语,但也可以支持const
另一方面,用于声明对象的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
上面的示例完全使对象不可变
让我们看看下面的例子
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;
它将抛出重复声明“obj”
同样根据mozilla文档的解释
const声明创建对值的只读引用它
并不意味着它所持有的值是不可变的,仅仅是
无法重新分配变量标识符
此示例是根据babeljs ES6功能创建的。const
和Object.freeze
是两个完全不同的东西
const
适用于绑定(“变量”)。它创建了一个不可变的绑定,即不能为绑定分配新值
Object.freeze
作用于值,更具体地说,作用于对象值。它使对象不可变,即不能更改其属性。Summary:
const
和Object.freeze()
的用途完全不同
const
用于声明必须立即分配且不能重新分配的变量。const
声明的变量与var
Object.freeze()
是一种接受对象并返回相同对象的方法。现在,对象不能删除其任何属性或添加任何新属性
示例const
:
示例1:无法重新分配const
constfoo=5;
foo=6代码>简单一点
它们是不同的。检查代码上的注释,这将解释每种情况。
Const
-它是块作用域变量,类似于let
,不能重新分配、重新声明该值
这意味着
{
const val = 10; // you can not access it outside this block, block scope variable
}
console.log(val); // undefined because it is block scope
const constvalue = 1;
constvalue = 2; // will give error as we are re-assigning the value;
const obj = { a:1 , b:2};
obj.a = 3;
obj.c = 4;
console.log(obj); // obj = {a:3,b:2,c:4} we are not assigning the value of identifier we can
// change the object properties, const applied only on value, not with properties
obj = {x:1}; // error you are re-assigning the value of constant obj
obj.a = 2 ; // you can add, delete element of object
整体理解是const是块范围,其值不会被重新分配。
对象。冻结
:
对象根属性是不可更改的,我们也不能添加和删除更多属性,但我们可以重新分配整个对象
var x = Object.freeze({data:1,
name:{
firstname:"hero", lastname:"nolast"
}
});
x.data = 12; // the object properties can not be change but in const you can do
x.firstname ="adasd"; // you can not add new properties to object but in const you can do
x.name.firstname = "dashdjkha"; // The nested value are changeable
//The thing you can do in Object.freeze but not in const
x = { a: 1}; // you can reassign the object when it is Object.freeze but const its not allowed
//两者相似的一点是,嵌套对象是可变的
const obj1 = {nested :{a:10}};
var obj2 = Object.freeze({nested :{a:10}});
obj1.nested.a = 20; // both statement works
obj2.nested.a = 20;
谢谢。我已经习惯于在构建过程中使用,所以我可以主要忽略这些兼容性问题。不,它们有不同的功能。常数阻止重新分配(例如,不能常数x=1;x=2);冻结防止突变(例如,你不能反对。冻结(x);x.a=2);我不确定这是一个新问题还是把它放在这里有意义,但我也想知道符号和物体之间是否有很大的区别。冻结?我觉得它们也是相关的(即符号被评估为从对象冻结。isfreezed
,但它们也是它们自己的原始数据类型…)突变仅在第一级被阻止,因此您不能反对。冻结(x);x、 a=2,但你可以反对。冻结(x);x、 a.b=2。看见对于完全冻结使用临时库,基本上,const
是新的var
;它只是块作用域,防止重新分配。您可以使用let
,但实际上仅当您要更改变量所指向的值时才需要使用,这对于循环控制/迭代器变量和简单类型(如数字和字符串)来说是有意义的,但对于大多数对象(包括数组)的使用则没有意义。如果您想要一个内容无法更改的对象/数组,那么除了用const
声明它之外,您还应该对其调用object.freeze()
。const
不是新的var
,let
是新的var
似乎是对象。freeze只对对象有效,对值类型无效。e、 g.var年龄=33;冻结(年龄);年龄=34岁//没问题
年龄仍然可以毫无问题地改变。@MuhammadShoaib:你在比较苹果和桔子Object.freeze
不会阻止您为变量指定不同的值,这就是const
的作用。当您使用对象时,您的示例将显示相同的“问题”:var age={years:33};冻结(年龄);年龄={岁:34};//没问题
。此外,原始值已经是不可变的……这个解释一下子就解决了我的许多问题!关于ob1.bar.value=4;//(冻结)修改,因为ob1.bar是嵌套的
:这是因为方法的范围吗?很好的解释
const obj1 = {nested :{a:10}};
var obj2 = Object.freeze({nested :{a:10}});
obj1.nested.a = 20; // both statement works
obj2.nested.a = 20;