Обработка параметров в JavaScript часто вызывает путаницу, её часто ошибочно описывают как передачу по ссылке или по значению. На самом деле всё сложнее: JavaScript использует механизм, сочетающий аспекты обоих способов, и он полностью зависит от типа данных.
Оглавление
- Передача по значению для примитивных типов
- Передача по ссылке для объектов
- Согласование передачи по значению и по ссылке в JavaScript
Передача по значению для примитивных типов
Примитивные типы данных JavaScript — number
, string
, boolean
, null
, undefined
, bigint
и symbol
— работают с передачей по значению. Когда примитивный тип передаётся в функцию, создаётся и передаётся копия его значения. Изменения внутри функции затрагивают только эту копию, оставляя исходную переменную неизменной.
let x = 10;
function changeValue(y) {
y = 20;
}
changeValue(x);
console.log(x); // Вывод: 10
В этом примере изменение y
внутри changeValue
не изменяет исходный x
.
Передача по ссылке для объектов
Объекты в JavaScript (включая массивы и функции) ведут себя по-другому. Когда объект передаётся в функцию, передаётся ссылка — указатель на местоположение объекта в памяти. Поэтому любые изменения свойств объекта *внутри* функции напрямую влияют на исходный объект.
let myArray = [1, 2, 3];
function modifyArray(arr) {
arr.push(4);
}
modifyArray(myArray);
console.log(myArray); // Вывод: [1, 2, 3, 4]
Здесь myArray
изменяется, потому что функция изменяет сам объект, а не его копию.
Однако существует важное различие: переприсваивание параметра *новому* объекту внутри функции не изменяет оригинал.
let myObject = { a: 1 };
function reassignObject(obj) {
obj = { a: 2 }; // Присваивание нового объекта
}
reassignObject(myObject);
console.log(myObject); // Вывод: { a: 1 }
Внутри reassignObject
, obj
указывает на другой объект; исходный myObject
остаётся неизменным.
Согласование передачи по значению и по ссылке в JavaScript
Передача параметров в JavaScript не является строго одной из них. Это контекстно-зависимая система:
- Примитивные типы: Передача по значению. Передаётся копия значения; внутренние изменения не влияют на оригинал.
- Объекты: Передача по ссылке. Передаётся ссылка на объект; изменения свойств объекта влияют на оригинал. Переприсваивание параметра новому объекту внутри функции оставляет оригинал неизменным.
Освоение этого различия имеет решающее значение для написания надёжного и предсказуемого кода JavaScript. Поведение полностью зависит от того, работаете ли вы с примитивами или объектами.