Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «За посиланням чи за значенням». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Передавання за значенням** означає, що змінна зберігає саме значення, і при копіюванні створюється нова незалежна копія даних; **передавання за посиланням** означає, що змінна зберігає посилання на місце в пам'яті, де знаходиться об'єкт. **Ключове:** примітиви передаються за значенням, а об'єкти та масиви - за посиланням, тому зміна одного об'єкта впливає на інший, якщо вони пов'язані посиланням.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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;` | --- ## Коротко - **За значенням** → створюється **копія даних**. - **За посиланням** → копіюється **вказівник** на той самий об'єкт. - Тому зміна одного об'єкта **впливає** на інший, якщо вони пов'язані посиланням.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.