JavaScript Fundamentals

Передача параметров в JavaScript: по значению и по ссылке

Spread the love

Обработка параметров в 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. Поведение полностью зависит от того, работаете ли вы с примитивами или объектами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *