Подтвердить что ты не робот

Object.freeze() vs const

Object.freeze() кажется переходным методом удобства для перехода к использованию const в ES6.

Существуют ли случаи, когда они занимают свое место в коде или есть предпочтительный способ работы с неизменяемыми данными?

Должен ли я использовать Object.freeze() до тех пор, пока все браузеры, с которыми я работаю с поддержкой const, вместо этого перейдем к использованию const?

4b9b3361

Ответ 1

const и Object.freeze - две совершенно разные вещи.

const применяется к привязкам ( "переменные" ). Он создает неизменяемое связывание, т.е. Вы не можете назначить новое значение привязке.

Object.freeze работает с значениями и, более конкретно, значениями объектов. Это делает объект неизменным, т.е. Вы не можете изменить его свойства.

Ответ 2

В ES5 Object.freeze не работает на примитивах, которые, вероятно, будут чаще объявляться с использованием 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

Ответ 3

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 Docs Const

Объявление const создает доступную только для чтения ссылку на значение. Это не означает, что значение, которое оно содержит, является неизменным, только то, что идентификатор переменной не может быть переназначен.

Эти примеры созданы в соответствии с возможностями babeljs ES6.

Ответ 4

Резюме:

const и Object.freeze() служат совершенно разным целям.

  • const предназначен для объявления переменной, которая должна быть назначена сразу и не может быть переназначена. переменные, объявленные const являются областью видимости блока, а не областью действия, как переменные, объявленные с помощью var
  • Object.freeze() - это метод, который принимает объект и возвращает тот же объект. Теперь объект не может удалить ни одного из своих свойств или добавить какие-либо новые свойства.

Примеры const:

Пример 1: не могу переназначить const

const foo = 5;

foo = 6;

Ответ 5

Пусть будет просто.

Они разные. Проверьте комментарии к коду, которые объяснят каждый случай.

Const - это переменная области видимости блока, например let, значение которой не может быть переназначено, повторно объявлено.

Это означает

{
 const val = 10;  // you can not access it out side 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 reassigning 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 reassigning the value of constant obj 
obj.a = 2 ;     // you can add ,delete element of object

Полное понимание состоит в том, что const является областью действия блока, и его значение не переназначается.

Object.freeze: корневые свойства объекта неизменны, также мы не можем добавлять и удалять дополнительные свойства, но мы можем переназначить весь объект снова.

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;

Благодарю.