Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: primitive types, objects, assignment, reference, copy

Как ведут себя примитивные типы и объекты при присваивании?

Вопрос проверяет понимание различий в поведении примитивных типов и объектов при операциях присваивания и передачи в функции, что критично для избегания ошибок с мутациями и побочными эффектами.

Короткий ответ

Примитивные типы (числа, строки, булевы значения) копируются по значению. При присваивании создаётся независимая копия значения. Объекты (включая массивы и функции) копируются по ссылке. При присваивании переменная получает ссылку на тот же объект в памяти, поэтому изменения через одну переменную видны через другую. Это фундаментальное различие влияет на логику работы с данными.

Длинный ответ

В JavaScript данные делятся на примитивные типы (number, string, boolean, null, undefined, symbol, bigint) и объекты (включая массивы, функции, даты). При присваивании или передаче в функцию они ведут себя принципиально по-разному из-за способа хранения в памяти.

Примитивные типы: копирование по значению

Когда вы присваиваете переменную с примитивным значением другой переменной, создаётся новая, независимая копия этого значения. Две переменные после этого никак не связаны. Изменение одной не затронет другую.

let a = 10;
let b = a; // b получает копию значения 10
b = 20;
console.log(a); // 10 — a не изменилось
console.log(b); // 20

Объекты: копирование по ссылке

Объекты хранятся в памяти, а переменная содержит лишь ссылку (адрес) на этот объект. При присваивании копируется именно эта ссылка, а не сам объект. В результате несколько переменных начинают указывать на один и тот же объект в памяти.

let obj1 = { name: 'Alice' };
let obj2 = obj1; // obj2 получает ссылку на тот же объект
obj2.name = 'Bob';
console.log(obj1.name); // 'Bob' — изменение видно через obj1
console.log(obj2.name); // 'Bob'

То же самое происходит при передаче объекта в функцию — функция получает ссылку, и может изменить исходный объект (побочный эффект).

Практические последствия и создание копий

Понимание этого механизма важно для управления состоянием, особенно в React, Redux или при работе с массивами. Чтобы избежать нежелательных мутаций, часто нужно создавать настоящие копии объектов.

  • Поверхностное копирование объекта: const copy = { ...original }; или Object.assign({}, original).
  • Поверхностное копирование массива: const copy = [...original]; или original.slice().
  • Глубокое копирование (для вложенных объектов) можно сделать с помощью JSON.parse(JSON.stringify(obj)) (с ограничениями) или библиотек типа Lodash.
// Пример поверхностного копирования
const original = { x: 1, nested: { y: 2 } };
const shallowCopy = { ...original };
shallowCopy.x = 99; // Не влияет на original
shallowCopy.nested.y = 100; // Влияет на original.nested!
console.log(original.x); // 1
console.log(original.nested.y); // 100

Вывод: Примитивы копируются по значению, что делает работу с ними предсказуемой и безопасной. Объекты копируются по ссылке, что требует внимательности при модификациях и часто necessitates создание явных копий для изоляции данных, особенно в архитектурах, чувствительных к побочным эффектам.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#primitive types

#objects

#assignment

#reference

#copy

Подпишись на React Developer в телеграм