Есть ли что-то вроде pass by value pass by reference в JavaScript?
Когда я начал изучать функцию в С++, все ее содержимое проходило по значению и ссылке.
Есть ли что-то подобное в javascript?
Если да/нет, как это работает в случае javascript?
Спасибо всем.
Ответы
Ответ 1
JavaScript всегда передается по значению, никогда не передается по ссылке. Многие люди путают это из-за того, как работают объекты.
Нет никакой "передачи по ссылке" для любой переменной в JavaScript (нет, даже если объект назначен этой переменной). Все переменные и аргументы назначаются значением. Если назначенное значение является объектом, то значение новой переменной является ссылкой на этот объект, но присвоение нового значения/объекта новой переменной не повлияет на исходную переменную.
Некоторые люди называют это поведение передачей "значение по ссылке".
Сравнение - PHP
$foo = "foo";
$bar = &$foo; // assign by reference
$bar = "bar";
echo $foo; // -> output: "bar"
JavaScript
foo = {"foo": true};
bar = foo; // assign value by reference
bar = {"bar": true};
alert(JSON.stringify(foo)); // -> output: '{"foo": true}
Ответ 2
Другие ответы на этот вопрос верны - все переменные передаются по значению в JavaScript, и иногда это значение указывает на объект.
Когда язык программирования поддерживает передачу по ссылке, можно изменить, где переменная указывает внутри функции. Это невозможно в JavaScript.
Например, рассмотрим этот код, который пытается переназначить переданную переменную новому значению:
function changeCaller( x ) {
x = "bar"; // Ha ha!
}
function testChangeCaller() {
var x = "foo";
changeCaller(x);
alert(x); // still "foo"
}
testChangeCaller();
Попытки указывать переменные в новых объектах не выполняются так же, как в приведенном выше примере не удается переназначить примитивную строку:
function changeCaller( x ) {
x = new Object(); // no longer pointing to the same object
x.a = "bar";
}
function testChangeCaller() {
var x = new Object();
x.a = "foo";
changeCaller(x);
alert(x.a); // still "foo"
}
testChangeCaller();
Функция, которая заставляет людей полагать, что они имеют дело с сценарием с пересылкой, - это изменение объектов. Вы можете вносить изменения в объект или массив, потому что локальная переменная указывает на один и тот же объект:
function changeCaller( x ) {
x.a = "bar";
}
function testChangeCaller() {
var x = new Object();
x.a = "foo";
changeCaller(x);
alert(x.a); // now "bar", since changeCaller worked on the same object
}
testChangeCaller();
Надеюсь, это поможет!
Ответ 3
В отношении обсуждения соображения о "значении" и "ссылке" неверны для исключения комментария Pointy.
Javascript, как и другие ссылки, такие как С# или java, не передают рефери самой переменной этому методу, а ссылку на объект, на который ссылается переменная.
То, что люди здесь ждут, передает указатель на переменную, которая ссылается на объект, передает по указателю не то же самое, что и передать по ссылке, и, конечно же, это не то же самое, что передавать по значению.
Ожидаемое поведение - это проход по указателю.
Передача по ссылке отправляет ссылку на объект.
Передайте по значению копию объекта, хранящегося в переменной, и передайте копию
к методу.
Ответ 4
Проход по значению, проходящий по ссылке, является злым мемом. Этот злой мем также появляется в обсуждениях на Java.
Это просто: битовая диаграмма значения копируется в параметр. Не имеет значения, является ли битовый шаблон int или если он является адресом объекта - он просто побито, побитно, в параметр. Это не могло быть проще. Время выполнения не делает что-то особенное для примитивов и ссылок. Он просто и всегда просто копирует значение.
Термин "компьютерная наука" для этого - "пройти по значению".
Передача по ссылке просто больше не используется в программировании. В более старых языках, таких как Pascal, вы можете закодировать функцию, чтобы напрямую изменять значение в вызывающей процедуре. Так, например, переменная int в вызывающей процедуре может быть изменена в вызываемой функции.
Ответ 5
Примитивные значения передаются через значение, а объекты передаются через ссылку.
Строки неизменяемы, поэтому они передаются через ссылку, хотя они считаются примитивными.