← Назад к вопросам

Как передается значение ссылочного типа?

2.3 Middle🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Передача ссылочных типов в JavaScript

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

Типы данных

Примитивные (передаются по значению):

  • string, number, boolean, null, undefined, symbol, bigint

Ссылочные (передаются по ссылке):

  • Объекты {}, массивы [], функции, даты и др.

Копирование значений

let a = 5;
let b = a; // копируется значение
b = 10;
console.log(a); // 5

Для объектов копируется ссылка:

const obj1 = { name: 'Иван' };
const obj2 = obj1; // обе переменные указывают на один объект
obj2.name = 'Мария';
console.log(obj1.name); // 'Мария'

Передача в функции

function changeNumber(x) {
  x = 20; // не влияет на исходную переменную
}
let num = 5;
changeNumber(num);
console.log(num); // 5

function changeObject(obj) {
  obj.name = 'Петр'; // влияет на исходный объект
}
const user = { name: 'Иван' };
changeObject(user);
console.log(user.name); // 'Петр'

Переназначение vs изменение

const user = { name: 'Иван' };

function wrong(obj) {
  obj = { name: 'Мария' }; // только локальная переменная
}
wrong(user);
console.log(user.name); // 'Иван'

function correct(obj) {
  obj.name = 'Мария'; // меняет сам объект
}
correct(user);
console.log(user.name); // 'Мария'

Копирование объектов

Shallow copy:

const original = { name: 'Иван', address: { city: 'Москва' } };
const copy = { ...original };
copy.name = 'Мария';
console.log(original.name); // 'Иван'

Deep copy:

const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.address.city = 'СПб';
console.log(original.address.city); // 'Москва'

Сравнение

const obj1 = { name: 'Иван' };
const obj2 = { name: 'Иван' };
const obj3 = obj1;

console.log(obj1 === obj2); // false — разные объекты
console.log(obj1 === obj3); // true — одна ссылка

Правила

✓ Примитивы копируются полностью ✓ Объекты передаются по ссылке ✓ Переназначение не меняет исходный объект ✓ Изменение свойств меняет исходный объект ✓ Используй spread или JSON.parse для копирования

Понимание разницы между ссылочными и примитивными типами критично для написания правильного JavaScript кода.