За посиланням чи за значенням
1. Що означає «за значенням» (by value)
Коли змінна зберігає саме значення, а не посилання на нього. При копіюванні створюється нова незалежна копія даних.
Примітиви (прості типи даних) передаються за значенням.
До них належать:
numberstringbooleannullundefinedsymbolbigint
Приклад:
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)
Коли змінна не зберігає сам об'єкт, а зберігає посилання (вказівник) на місце в пам'яті, де цей об'єкт знаходиться.
Усі об'єкти і складні структури даних передаються за посиланням:
objectarrayfunctionDate,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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.