Когда использовать const с объектами в JavaScript?

Недавно я прочитал о ключе ES6 const, и я могу понять его важность, имея что-то вроде этого:

(function(){
    const PI = 3.14;
    PI = 3.15; //  Uncaught TypeError: Assignment to constant variable
})();

Таким образом, никто не может изменить мою переменную PI.

Непонятно, что я не понимаю, в какой ситуации использование const с объектами может иметь смысл (кроме предотвращения людей делать myObj = newValue;).

(function(){
    const obj = {a:1 ,b: 2, c:3};
    //obj = {x:7 , y:8, z: 9}
    //This is good
    //TypeError: Assignment to constant variable.

    obj.a=7; obj.b=8 ; obj.c=9;
    console.log(obj); //outputs: {a: 7, b: 8, c: 9}
})();

Итак, при объявлении объекта: когда я должен сказать: теперь я должен объявить мой объект с помощью const?

Ответ 1

это распространенное заблуждение в Интернете, CONST не создает неизменяемые переменные, а создает неизменяемое связывание.

например.

 const temp1 = 1;
 temp1  = 2 //error thrown here.

Но

 temp1.temp = 3 // no error here. Valid JS code as per ES6

поэтому const создает привязку к этому конкретному объекту. const гарантирует, что переменная temp1 не будет иметь никакого другого объекта Binding.

Сейчас подходит к Object. мы можем получить неизменную особенность с помощью Object с помощью Object.freeze

const temp3 = Object.freeze( {a:3,b:4})
temp3.a = 2 // it wont update the value of a, it still have 3
temp3.c = 6 // still valid but wont change the object

Ответ 2

let и const предназначены для безопасности типов. Нет никакой ситуации, когда вы должны использовать их, но они могут быть удобными и затруднять обнаружение ошибок.

Один пример ситуации, когда const был бы полезен для объекта, который вы не хотите превращать в другой тип.

const x = {"hello":"world"};

// This is OK
x.hello = "stackoverflow";

// This is not OK
x = JSON.stringify(x);

Ответ 3

Если вы работаете с объектом и хотите убедиться, что идентичность объекта никогда не изменяется, скажите:

const a = {};

a.b = 1;

// ... somewhere in the other part of the code or from an async call
// suddenly

someAjaxCall().then(() => { a = null; }) // for preventing this

Также использование const - хороший совет для компилятора javascript для оптимизации вашего кода, что значительно ускоряет выполнение с помощью let или var потому что идентичность никогда не меняется,

НО

Остерегайтесь использования циклов const/let in по соображениям производительности, поскольку это может снизить производительность из-за создания переменной в цикле, но в большинстве случаев разница незначительна.

Ответ 4

В соответствии с эта ссылка:

Коранты используются для создания переменных, которые не могут быть повторно назначены новым контентом. Ключевое слово "const" делает переменную самой неизменной, а не ее назначенным контентом (например, если контент является объектом, это означает, что сам объект все равно может быть изменен).

Это означает, что можно изменить контент объекта, который присваивается переменной const, но вы не можете назначить новый объект этой константной переменной.

Вы также можете добавить к вашему объекту новый атрибут.

const myVar = "someValue";
const myObj = {"name": "nameValue", "age": 14}

console.log(myVar); //someValue
console.log(myObj.name); //nameValue

myObj.name = "newNameValue"; 
console.log(myObj.name); //newNameValue

myObj.someNewAttr = "newAttrValue";
console.log(myObj.someNewAttr); //newAttrValue

myObj = {"newNameAttr": "newNameValue"}; //Uncaught TypeError: Assignment to constant variable.
console.log(myObj.newNameAttr);

myVar = "newValue"; //Uncaught TypeError: Assignment to constant variable.
console.log(myVar);

Вы также можете попробовать и посмотреть на этой скрипте: https://jsfiddle.net/am2cbb00/1/

Ответ 5

Вы объявляете объект как const, если не намерены изменять его значение. Таким образом, этот объект будет доступен только для чтения. В es6 изменяемые объекты создаются с let

let x = {asdf: 1}