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