Javascript Object.freeze()vs const

Javascript Object.freeze()vs const,javascript,ecmascript-6,Javascript,Ecmascript 6,在ES6中使用const似乎是一种过渡性的方便方法 是否存在这样的情况,即两者都在代码中占有一席之地,或者是否有更好的方法来处理不可变数据 我是否应该一直使用支持const的所有浏览器,然后改为使用const呢?在ES5对象中。冻结不适用于原语,与对象相比,使用const可能更常见。您可以在ES6中冻结原语,但也可以支持const 另一方面,用于声明对象的const不会“冻结”它们,只是不能重新声明整个对象,但可以自由修改其关键帧。另一方面,您可以重新声明冻结的对象 Object.freeze也

在ES6中使用
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;