В Javascript, как мы все знаем, типы данных, такие как числа, строки и логические значения, используются по значению, а объекты с другой стороны используются по ссылке.
Кратко об объектах
С помощью объекта мы можем изменить значение объекта, изменив его свойства. Когда мы сравниваем объекты, мы, по сути, сравниваем адрес, по которому хранится объект, а не фактические значения. В JavaScript нет встроенной операции «глубокого» сравнения, которая просматривает содержимое объекта, но ее можно написать самостоятельно
var object1 = {значение: 20};
var object2 = object1;
var object3 = {value: 20};
console.log(object1 == object2);
// → true
console.log(object1 == object3);
// → false
Что такое неизменность и зачем она нужна?
Неизменяемый означает «то, что нельзя изменить». Это то, что это означает с точки зрения javascript, каждая переменная хранится в каком-то физическом месте, то есть у каждой переменной есть адрес. Значение по этому адресу не может быть изменено. Это неизменно.
Пример :
var str = «Привет, мир!»;
var res = str.slice(1, 5);
Здесь метод slice не изменяет значение, хранящееся там, где хранится «str», он фактически возвращает новую строку, которая назначается «res».
На самом деле числа, строки и логические значения неизменяемы.
Но в случае массивов и объектов можно изменить значение, что означает, что они изменяемы.
var obj1= {val: ‘Объект здесь’}
obj1.name = ‘obj1’;
console.log(obj1);
// Выводит {name: obj1, val: ‘Объекты здесь’}
Все объекты и массивы изменяемы.
Как сделать массивы или объекты изменяемыми?
Это большой вопрос, и это очень распространенная потребность. Это основа React/Redux, гарантирующая, что один из столпов редукции «состояние», который по сути является объектом, всегда должен быть неизменным.
Есть много способов добиться этого:
- Использование пользовательской библиотеки, такой как immutableJS от facebook, помогает нам достичь этого.
- Использование Object.assign() [функция ES6]
const person = {имя: «Джон», возраст: 28}
const newPerson = Object.assign({}, человек, {возраст: 30})
console.log(newPerson === человек) // false
console.log(человек) // {имя: «Джон», возраст: 28}
console.log(newPerson) // {имя: «Джон», возраст: 30}
Это все.
Удачных иммутантов!!