Скидки до 20% + 2-ая профессия бесплатно и подарки на 50 000₽

Главная | Все статьи | Дневник студента

Мутирование объектов, или почему важна иммутабельность в JavaScript

Время чтения статьи ~2 минуты
Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Мутирование объектов, или почему важна иммутабельность в JavaScript главное изображение

Мутирование объектов в JavaScript не всегда плохо, и в некоторых случаях это может быть полезным. Однако есть несколько причин, почему мутирование объектов может быть нежелательным:

  1. Несогласованность данных. Если объекты изменяются в разных частях программы, то могут возникнуть проблемы с несогласованностью данных. Например, если в одной части программы мы удалили свойство объекта, а в другой части программы ожидаем, что это свойство существует, то это может привести к ошибкам.

  2. Неявные побочные эффекты. Мутирование объектов может привести к неявным побочным эффектам, которые могут быть сложными для отслеживания. Например, если мы передаем объект в функцию, которая изменяет его свойства, то это может повлиять на другие части программы, которые используют этот же объект.

  3. Сложность отладки. Мутирование объектов может сделать программу сложной для отладки, особенно если объект изменяется в разных частях программы. Это может привести к тому, что ошибки будут трудно обнаруживать и исправлять.

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

Для создания неизменяемых объектов в JavaScript можно использовать библиотеки, такие как Immutable.js или Immer.js. Но также можно реализовать иммутабельность самостоятельно. Вот пример кода, демонстрирующий, как создать неизменяемый объект с помощью JavaScript:

const person = Object.freeze({ name: 'John', age: 30 });

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

person.age = 31; // TypeError: Cannot assign to read only property 'age' of object

Также мы можем создать неизменяемый массив, используя метод Object.freeze() и распространение (spread) оператор:

const numbers = Object.freeze([1, 2, 3]);
const newNumbers = [...numbers, 4]; // создаем новый массив, добавляя элемент
console.log(numbers); // [1, 2, 3]
console.log(newNumbers); // [1, 2, 3, 4]

В этом примере мы используем распространение (spread) оператор, чтобы создать новый массив, добавляя новый элемент, но не изменяя исходный массив. Затем мы выводим оба массива в консоль, чтобы убедиться, что исходный массив остался неизменным.

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

Аватар пользователя Андрей Мазунин
Андрей Мазунин 21 февраля 2023
7
Похожие статьи
Рекомендуемые программы
профессия
Верстка на HTML5 и CSS3, Программирование на JavaScript в браузере, разработка клиентских приложений используя React
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Тестирование веб-приложений, чек-листы и тест-кейсы, этапы тестирования, DevTools, Postman, SQL, Git, HTTP/HTTPS, API
4 месяца
с нуля
Старт 26 декабря
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Ruby, Разработка веб-приложений и сервисов используя Rails, проектирование и реализация REST API
5 месяцев
c опытом
Старт 26 декабря
профессия
Программирование на JavaScript в браузере и на сервере (Node.js), разработка бекендов на Fastify и фронтенда на React
16 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на JavaScript, разработка веб-приложений, bff и сервисов используя Fastify, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Git, JavaScript, Playwright, бэкенд-тесты, юнит-тесты, API-тесты, UI-тесты, Github Actions, HTTP/HTTPS, API, Docker, SQL
8 месяцев
c опытом
Старт 26 декабря