Skip to main content

Аргументи за значенням

Основна ідея

Коли ми передаємо аргументи у функцію, JavaScript їх копіює. Але яким саме чином копіює - залежить від типу даних:

Тип данихЯк передається
Примітиви (числа, рядки, булеві, null, undefined, symbol, bigint)за значенням
Об'єкти, масиви, функціїза посиланням (точніше - за копією посилання)

1. Передача за значенням

Примітиви (числа, рядки, булеві тощо) копіюються повністю.

javascript
let a = 10; function changeValue(x) { x = 20; // змінюємо копію } changeValue(a); console.log(a); // 10

Пояснення:

  • У x записується копія значення a.
  • Зміна x не впливає на a.

У пам'яті:

javascript
a → 10 x → 10 (копія)

2. Передача за посиланням (насправді: за копією посилання)

Об'єкти, масиви та функції не копіюються повністю - натомість передається посилання на їхню адресу в пам'яті.

javascript
const user = { name: "Alice" }; function rename(obj) { obj.name = "Bob"; } rename(user); console.log(user.name); // "Bob"

Пояснення:

  • Змінна user зберігає посилання на об'єкт у пам'яті.
  • У obj копіюється це посилання, тому обидві змінні вказують на той самий об'єкт.
  • Зміни через obj видно і в user.

У пам'яті:

javascript
user ─┐ { name: "Bob" } obj ──┘

3. Але якщо змінити саме посилання всередині функції - оригінал не зміниться

javascript
const user = { name: "Alice" }; function reassign(obj) { obj = { name: "Charlie" }; // нове посилання } reassign(user); console.log(user.name); // "Alice"

Тут:

  • У obj спочатку копіюється посилання на user.
  • Потім obj перенаправляється на новий об'єкт, але оригінальне посилання (user) залишається незмінним.

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

javascript
const numbers = [1, 2, 3]; function modify(arr) { arr.push(4); // змінюємо вміст } modify(numbers); console.log(numbers); // [1, 2, 3, 4]

Але якщо переприсвоїти посилання:

javascript
function modify(arr) { arr = [9, 9, 9]; // створюємо новий масив } modify(numbers); console.log(numbers); // [1, 2, 3]

Коротко запам'ятати

Тип данихЯк передаєтьсяЗміна всередині функції впливає на оригінал?
Примітиви (number, string, boolean, null, undefined, symbol, bigint)За значеннямНі
Об'єкти, масиви, функціїЗа посиланням (копією посилання)Так (якщо змінюється вміст)
Переприсвоєння змінної всередині функції-Ні

Проста аналогія

  • За значенням - як передати копію листка паперу: якщо ти напишеш щось на своїй копії, оригінал не зміниться.
  • За посиланням - як передати адресу сейфа: обидва можуть відкрити той самий сейф і змінювати, що всередині.

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

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

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