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.Приведенный выше банальный пример - один.