Аргументи за значенням
Основна ідея
Коли ми передаємо аргументи у функцію, 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.