Есть ли что-то вроде 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

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

Строки неизменяемы, поэтому они передаются через ссылку, хотя они считаются примитивными.