Сегодня я ответил на вопрос о JavaScript, который включает в себя проблемы с назначением, поэтому я хочу тщательно обобщить этот вопрос.
Кода -копия выглядит следующим образом:
var a = 'test';
var b = function () {};
ba = 'test';
изменение функции (m, n) {
m = 'изменение';
na = 'change';
}
изменение (a, b);
Изменены ли значения переменных A и B после выполнения приведенного выше кода?
Оригинальные и ссылки на значения
Я представил исходное значение и справочное значение в предыдущих статьях. Исходное значение относится к неопределенному, нулевому, логическому, числу, строку и т. Д., Которые хранятся в стеке, в то время как эталонное значение интегрируется из объекта, который хранится в куче.
Здесь нам нужно отличить их:
Кода -копия выглядит следующим образом:
var a = 'test';
var b = new String ('test');
var a = 'true';
var b = new Boolean ('true');
Для приведенных выше четырех переменных A и A являются исходными значениями, в то время как B и B являются эталонными значениями.
Механизм назначения
После прояснения разницы между исходным значением и эталонным значением вы можете подробно представить механизм назначения JavaScript:
В JavaScript каждое назначение будет генерировать копию для переменных исходного типа значения и для указанных значений, как его имя присваивается ссылкой на память того же объекта хранения.
Назначение исходного значения:
Кода -копия выглядит следующим образом:
var a = 1; // исходное значение
var b = a; // генерировать копию с переменной b
b = 2; // не связано с
оповещение (a); // Выход 1
Присвоение ссылочных значений:
Кода -копия выглядит следующим образом:
var a = new object (); // Справочное значение
Топор = 1;
var b = a; // Справочное назначение, указывая на одну и ту же память
Bx = 2; // Модификация B повлияет на
оповещение (AX); // Выход 2
Параметр проход
Теперь давайте посмотрим, как обрабатывать передачу двух типов значений, чтобы функционировать параметры одновременно.
1. Пропустите исходное значение
Кода -копия выглядит следующим образом:
var a = 1;
Функциональный тест (M) {
m = 2;
}
тест (а);
оповещение (a); // Выход 1
Выход равен 1, поэтому мы знаем, что функция просто передает значение переменной, поэтому M в корпусе функции получает значение 1 и назначено 2. Этот процесс не влияет на внешнюю переменную a.
2. Пройдите справочное значение
Кода -копия выглядит следующим образом:
var a = new Object ();
Топор = 1
Функциональный тест (M) {
Mx = 2;
}
тест (а);
оповещение (AX); // Выход 2
Выход составляет 2, поэтому мы знаем, что функция передает адрес переменной, поэтому m в корпусе функции получает переданный адрес. Следовательно, когда атрибут x назначен 2, он также повлияет на то же адресу памяти.
Суммировать
Теперь давайте вернемся к вступительному вопросу:
Кода -копия выглядит следующим образом:
var a = 'test';
var b = function () {};
ba = 'test';
изменение функции (m, n) {
m = 'изменение';
na = 'change';
}
изменение (a, b);
Переменная a - исходное значение, переменная b - это опорное значение, а одно передается в корпус функции как значение, а другая - адрес, поэтому после выполнения функции переменная A не будет изменяться, и значение переменной B изменится.