Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: value, reference, copy, assignment, mutability

Чем отличается копирование по значению от копирования по ссылке?

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

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

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

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

В программировании передача данных между переменными или в функции может происходить двумя принципиально разными способами, которые влияют на поведение программы и управление памятью.

Копирование по значению (Pass by Value)

При копировании по значению создаётся новая, независимая копия самого значения. Две переменные после операции присваивания хранят одинаковые данные, но в разных ячейках памяти. Изменение одной переменной никак не влияет на другую. Этот механизм обычно используется для примитивных типов данных, таких как числа, булевы значения и строки (в некоторых языках строки могут быть неизменяемыми объектами, но семантика передачи часто остаётся value-like).

// Пример на JavaScript (примитивы копируются по значению)
let a = 10;
let b = a; // Копирование значения числа 10
b = 20;    // Изменяем копию
console.log(a); // 10 - оригинал не изменился
console.log(b); // 20

Копирование по ссылке (Pass by Reference)

При копировании по ссылке копируется не само значение, а адрес (ссылка) на область памяти, где хранятся данные. В результате несколько переменных начинают указывать на один и тот же объект в памяти. Изменение данных через одну переменную будет сразу видны при обращении через другую. Это характерно для составных типов: объектов, массивов, словарей.

// Пример на JavaScript (объекты копируются по ссылке)
let obj1 = { name: 'Alice' };
let obj2 = obj1; // Копируется ссылка, а не объект
obj2.name = 'Bob'; // Меняем свойство через вторую ссылку
console.log(obj1.name); // 'Bob' - оригинал изменился!
console.log(obj2.name); // 'Bob'

Практическое применение и нюансы

Понимание разницы критично при работе с функциями, изменяющими свои аргументы, и при управлении состоянием в приложениях. Например, в React состояние должно обновляться иммутабельно, создавая новые объекты, а не мутируя старые. Для создания настоящей независимой копии объекта нужно использовать методы вроде Object.assign(), spread-оператора {...obj} или JSON.parse(JSON.stringify(obj)) для глубокого копирования.

Важно отметить, что в некоторых языках (например, Python) семантика передачи аргументов в функции описывается как "передача по присваиванию объекта" (call by object reference), где поведение зависит от изменяемости (mutability) объекта.

Вывод: Используйте знание о типах копирования для контроля над данными: копирование по значению безопасно и предсказуемо, а при работе со ссылками необходимо осознанно создавать глубокие копии, когда нужно изолировать изменения, или намеренно использовать общие данные для эффективности.

Уровень

  • Рейтинг:

    5

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

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

#value

#reference

#copy

#assignment

#mutability

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