Передача по значению или передача по ссылке | Продвинутая серия JavaScript

В этом посте мы рассмотрим разницу между передачей по значению и по ссылке в JavaScript.

0. Личная точка зрения на предмет

Эти концепции были определены задолго до того, как был создан JavaScript, и поэтому неадекватно представляют семантику JavaScript. Но, если вы все же хотите применить их к JavaScript, я попытаюсь объяснить концепции с точки зрения JavaScript.

1. Некоторые определения

Переменная: символ с несколькими значениями, который относится к значению в определенной позиции в памяти. В большинстве случаев эта фраза слишком перегружена, чтобы ее можно было использовать отдельно для уточнения деталей.

Значение. Конкретные биты, хранящиеся в памяти, на которые ссылается символ переменной.

Место в памяти: место в памяти, где хранится значение переменной.

Вызываемый и вызывающий: Вызываемый - это функция, которая была вызвана другой функцией, а вызывающий - это функция, которая вызывает другую функцию (вызываемый).

Формальный параметр. Формальные параметры - это предварительно заданные значения, которые функция получает при вызове.

Фактический параметр: Фактические параметры - это значения, которые предоставляются в вызове функции.

Некоторые примечания:

Переменные - это указатели значений.

Переназначение переменной просто изменяет значение ссылки.

Поскольку каждая переменная имеет свой собственный указатель, переназначение переменной не влияет на другие переменные, которые указывали на тот же объект.

2. Что такое передача по значению?

Термин «передача по значению» относится к созданию в памяти копии реального значения параметра. Например, у вызывающего и вызываемого есть две независимые переменные с одинаковым значением. Последствия изменения значения параметра вызываемым объектом не очевидны для вызывающего абонента. Не волнуйтесь, если вы не поняли по определению, я немного объясню это на примере кода.

3. Что такое передача по ссылке?

Термин «передача по ссылке» относится к передаче ссылки на аргумент в вызывающей функции соответствующему формальному параметру вызываемой функции. Используя ссылку, приведенную в, вызываемая функция может изменить значение аргумента. Опять же, не волнуйтесь, если вы не поняли по определению, я приведу примеры кода чуть позже в этой статье.

4. Является ли JavaScript передачей по значению или передачей по ссылке?

У нас есть функции в JavaScript и аргументы, которые мы передаем этим функциям. Однако не всегда очевидно, как JavaScript обрабатывает данные, которые вы вводите. В JavaScript нет такой вещи, как «передача по ссылке» для какой-либо переменной. Всем переменным и аргументам присвоено значение, однако значение переменной объекта является ссылкой. В результате, если вы предоставите объект и измените его члены внутри метода, эти изменения останутся вне функции. Это создает впечатление, что это система передачи по ссылке. Примитивные значения, такие как целое число, строка и логическое значение, предоставляются по значению, но объекты и массивы, как указано ранее, передаются по ссылке.

5. Пример передачи JavaScript по значению

Допустим, у вас определены две целочисленные (примитивный тип данных) переменные.

var num1 = 1;
var num2 = 2;

Затем, допустим, вы определяете третье целое число, num3, и назначаете ему num1. Затем создайте console.log для num3 и num1. После того, как вы сделаете то же самое, присвоив num2 значению num3.

var num3 = num1;
console.log(num1); //outputs 1
console.log(num3); //also outputs 1
num3 = num2;
console.log(num1); //outputs 2
console.log(num2); //also 2

Итак, в этом примере кода ничего не изменилось для num1 и num2, поскольку мы только что присвоили их другой переменной. , num3, другими словами, мы передали их значение в num3 и num3 теперь имеет новое значение указателя в памяти и не имеет ничего общего с num1 и num2. Давайте углубимся в подробности. Теперь мы снова присвоим num1 num3 и изменим значение num3 и снова console.log.

num3 = num1;
num3 = 3;
console.log(num1); //outputs 1
console.log(num3); //outputs 3

Итак, здесь мы видим разные значения num1 и num3, а мы присвоили только num3 до num1 раньше. Это показывает, что обе переменные указывают на разные значения в памяти, поэтому изменение значения в одном из них не влияет на другое.

6. Пример передачи JavaScript по ссылке

Допустим, у вас определены 2 объекта:

var obj1 = {name: "Vəndam"};
var obj2 = {name: "Tofiy"};

Затем, допустим, вы определяете третий объект, obj3 и назначаете ему obj1. Затем создайте console.log как для obj3, так и для obj1. После того, как вы сделаете то же самое, назначив obj2 для obj3.

var obj3 = obj1;
console.log(obj1); //outputs {name: "Vəndam"}
console.log(obj3); //also outputs {name: "Vəndam"}
obj3 = obj2;
console.log(obj2); //outputs {name: "Tofiy"}
console.log(obj3); //also outputs {name: "Tofiy"}

Итак, в этом примере кода ничего не изменилось для obj1 и obj2, поскольку мы только что присвоили их другой переменной. , obj3, другими словами, мы передали их ссылку в памяти на obj3. Давайте углубимся в подробности. Теперь мы снова назначим obj1 obj3 и изменим параметр объекта obj3 и снова console.log.

obj3 = obj1;
obj3.name = "Mürşüd";
console.log(obj1); //outputs {name: "Mürşüd"}
console.log(obj3); //also outputs {name: "Mürşüd"}

Итак, здесь мы видим, что значения параметров объекта obj1 и obj3 изменены, в то время как мы изменили только obj3.name значение. Это показывает, что оба объекта указывают на одну и ту же ссылку в памяти, поэтому изменение параметра в одном из них отражается в другом.

7. Заключение

В заключение, в JavaScript всем переменным и аргументам присвоено значение, что означает, что они передаются по значению (примитивные типы данных), однако значение переменной объекта является ссылкой, следовательно, составные типы в JavaScript передаются по ссылке.