English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Глубокое рассмотрение того, передается ли JS по значению или по ссылке (рекомендуется)

Передача по значению (call by value) - это наиболее часто используемый способ оценки: параметр функции является копией переданного аргумента. Изменение значения параметра не влияет на аргумент.

  При передаче по ссылке (call by reference) функция принимает не копию, а неявную ссылку на аргумент, что означает, что если значение параметра функции изменяется, то изменяется и аргумент. И они оба указывают на один и тот же значений.

  Передача по ссылке усложняет отслеживание вызовов функции и иногда может вызывать некоторые крошечные ошибки.

  Передача по значению из-за необходимости клонировать копию каждый раз может быть менее производительной для некоторых сложных типов. У обоих способов передачи есть свои проблемы.

  Основные типы JavaScript передаются по значению.

var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // все еще 1, не受到影响 от присвоения x = 2

  Давайте посмотрим, как передается объект:

var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, был изменен! 
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // по-прежнему 1, obj не был изменен на 100.

  可以看出,передача значений объектов не происходит по ссылке. На самом деле, по правильному пониманию, по способу передачи по совместному использованию (call by sharing), в JavaScript базовые типы передаются по значению, а объектные типы передаются по совместному использованию (call by sharing, также известный как передача по объекту, передача по объектной ссылке).

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

  В общем, базовые типы передаются по значению, а для объектов передается адрес, указывающий на объект, что также можно рассматривать как особый способ передачи по значению. Если вы производите операции с свойствами объекта в функции, это равноценно операциям с свойствами указанного объекта. Однако, если вы производите операции с целым объектом (например: o = 100 или o = []), это фактически создает новый объект, а адрес аргумента равен адресу нового объекта, который не имеет ничего общего с исходным адресом, поэтому это не влияет на исходный объект.

В приведенном выше руководстве по тому, передается ли JS по значению или по ссылке (рекомендуется), приведены все знания. Надеюсь, это поможет вам. Если у вас есть какие-либо вопросы, пожалуйста, оставляйте комментарии, я постараюсь ответить вам своевременно. В этом также выражаю признательность всем за поддержку сайта呐喊 руководства!

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не имеет права собственности, не underwent редактирование, и не несет ответственности за связанные с этим юридические вопросы. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для подачи жалобы и предоставления соответствующих доказательств. В случае подтверждения факта нарушения авторских прав, сайт незамедлительно удаляет涉嫌侵权的内容.

Основной учебник
Вам может понравиться