Понимание того, как передаются переменные - PullRequest
0 голосов
/ 31 марта 2012

Я просто не могу понять, как передаются переменные, почему некоторые передаются по ссылке, а другие по значению?

Пример:

var a=4;
var b=a;
b=b++;
alert(a);//unmodified 4

var c=["t","ttt"];
var d=c;
d=d.sort(function(x,y){return (y.length-x.length);});
alert(c);//modified ["ttt","t"]

Где можноЯ нахожу список, какие переменные будут работать как первый пример, а какие как второй?(логические значения, строки и т. д. ... их слишком много, чтобы проверить их все по ошибке)

Ответы [ 4 ]

6 голосов
/ 31 марта 2012

JavaScript это всегда передача по значению.

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

Взять, к примеру, C #.По умолчанию все в C # передается по значению, как и JavaScript.

void foo(string s) {
    s = "passbyvalue";
}

string a = "original value";
foo(a);
// a is still "original value"

Однако, если вы измените foo для использования передачи по ссылке, поведение изменится:

void foo(ref string s) {
    s = "passbyreference";
}
string a = "original value";
foo(ref a);
// a is now "passbyreference"  

В JavaScript возможен только первый пример.

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

Это может показаться небольшой, и даже анальной разницей.Но это ключевое отличие.Языки с истинной передачей по ссылке, такие как C # и C ++, позволяют вам делать то, что просто невозможно в таких языках, как JavaScript.Приведенный выше банальный пример - один.

3 голосов
/ 31 марта 2012

Представьте все в JavaScript как объект.Ссылки на объекты копируются по значению, но свойства объекта по-прежнему используются по ссылке.Итак:

var a = {};
var b = a;
b = 'Blah';
console.log(a); // Still {}

и

var a = {};
var b = a;
b.test = 'Blah';
console.log(a); // Is now {test: 'Blah'}

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

1 голос
/ 31 марта 2012

Обычно вы можете проверить метод на MDN . Например, документация метода sort гласит (выделение добавлено):

Сортирует элементы массива на месте и возвращает массив.

«На месте» там сказано, что он изменит массив.

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

1 голос
/ 31 марта 2012

Все объекты передаются по ссылке, а значения по значению. (технически это не так, но это объясняет поведение)

...