Skip to main content

За посиланням чи за значенням

1. Що означає «за значенням» (by value)

Коли змінна зберігає саме значення, а не посилання на нього. При копіюванні створюється нова незалежна копія даних.

Примітиви (прості типи даних) передаються за значенням.

До них належать:

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

Приклад:

javascript
let a = 5; let b = a; // копіюється значення 5 b = 10; console.log(a); // 5 ← не змінився console.log(b); // 10

a і b - тепер два незалежних значення. Зміна b не впливає на a.


2. Що означає «за посиланням» (by reference)

Коли змінна не зберігає сам об'єкт, а зберігає посилання (вказівник) на місце в пам'яті, де цей об'єкт знаходиться.

Усі об'єкти і складні структури даних передаються за посиланням:

  • object
  • array
  • function
  • Date, Map, Set тощо

Приклад з об'єктом:

javascript
const user1 = { name: 'Oleh' }; const user2 = user1; // копіюється ПОСИЛАННЯ, а не сам об'єкт user2.name = 'Maria'; console.log(user1.name); // "Maria" console.log(user2.name); // "Maria"

Обидва вказують на один і той самий об'єкт у пам'яті. Тому зміна user2 змінює і user1.


Візуально

javascript
┌──────────────┐ │ user1 │ ─┐ └──────────────┘ │ { name: "Oleh" } ┌──────────────┐ │ │ user2 │ ─┘ └──────────────┘

3. Приклад з масивом

javascript
const arr1 = [1, 2, 3]; const arr2 = arr1; arr2.push(4); console.log(arr1); // [1, 2, 3, 4] console.log(arr2); // [1, 2, 3, 4]

Обидва масиви - це один і той самий об'єкт у пам'яті.


4. Як створити копію об'єкта (щоб уникнути посилання)

Якщо хочеш створити новий незалежний об'єкт, потрібно явно скопіювати дані.

Поверхнева копія:

javascript
const user1 = { name: 'Oleh', age: 25 }; const user2 = { ...user1 }; // оператор spread user2.name = 'Maria'; console.log(user1.name); // "Oleh" console.log(user2.name); // "Maria"

Глибока копія (для вкладених об'єктів)

javascript
const user1 = { name: 'Oleh', address: { city: 'Kyiv' } }; const user2 = JSON.parse(JSON.stringify(user1)); // глибоке клонування user2.address.city = 'Lviv'; console.log(user1.address.city); // "Kyiv" console.log(user2.address.city); // "Lviv"

5. Аналогія

ТипДе зберігаєтьсяПри копіюванні
Примітив (by value)у стеку (stack)створюється нова копія
Об'єкт (by reference)у купі (heap)копіюється посилання на те саме місце

Підсумок

Тип данихПередаванняПриклад
string, number, boolean, null, undefined, symbol, bigintза значеннямlet a = 5; let b = a;
object, array, function, Date, Map, Setза посиланнямlet obj2 = obj1;

Коротко

  • За значенням → створюється копія даних.
  • За посиланням → копіюється вказівник на той самий об'єкт.
  • Тому зміна одного об'єкта впливає на інший, якщо вони пов'язані посиланням.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.