Семантика !! Установка конкретных определений обязательно сделает некоторые ответы и комментарии несовместимыми, поскольку они не описывают одно и то же, даже если используют одни и те же слова и фразы, но крайне важно преодолеть путаницу (особенно для новых программистов).
Прежде всего, существует несколько уровней абстракции, которые, кажется, понимают не все. Новым программистам, которые выучили языки 4-го и 5-го поколений, может быть трудно сосредоточиться на концепциях, знакомых ассемблерам или программистам на Си, не ориентированным на указатели на указатели на указатели. Передача по ссылке не просто означает возможность изменения ссылочного объекта с помощью переменной параметра функции.
Переменная : объединенная концепция символа, который ссылается на значение в определенном месте в памяти. Этот термин обычно слишком загружен, чтобы использовать его отдельно при обсуждении деталей.
Символ : текстовая строка, используемая для ссылки на переменную (т.е. имя переменной).
Значение : конкретные биты, хранящиеся в памяти и на которые ссылается символ переменной.
Область памяти : Где хранится значение переменной. (Само местоположение представляется числом, отдельным от значения, хранящегося в этом месте.)
Параметр функции : переменная, объявленная в определении функции, используется для ссылки на переменные, передаваемые в функцию.
Аргумент функции : переменная вне функции, которая передается функции вызывающей стороной.
Переменная объекта : Переменная, базовое значение которой не является самим «объектом», скорее ее значение является указателем (значением ячейки памяти) на другое место в памяти, где хранятся фактические данные объекта. В большинстве языков более высокого поколения аспект «указатель» эффективно скрывается автоматической разыменовкой в различных контекстах.
Примитивная переменная : переменная, значение которой является фактическим значением. Даже эта концепция может быть усложнена автобоксом и подобными объектам контекстами различных языков, но общие идеи заключаются в том, что значение переменной является фактическим значением, представленным символом переменной, а не указателем на другое место в памяти.
Аргументы и параметры функций - это не одно и то же. Кроме того, значение переменной не является объектом переменной (как уже указывалось различными людьми, но, очевидно, игнорируется). Эти различия имеют решающее значение для правильного понимания.
Передача по значению или Call-by-share (для объектов) : Значение аргумента функции копируется в другую область памяти, на которую ссылается символ параметра функции (независимо от того, находится ли он на стек или куча). Другими словами, параметр функции получил копию значения переданного аргумента ... И (критическое) значение аргумента НИКОГДА НЕ ОБНОВЛЯЕТСЯ / ИЗМЕНЕНО / ИЗМЕНЕНО вызывающей функцией. Помните, что значение переменной объекта НЕ является самим объектом, скорее это указатель на объект, поэтому передача переменной объекта по значению копирует указатель на переменную параметра функции. Значение параметра функции указывает на точно такой же объект в памяти. Сами данные объекта могут быть изменены непосредственно через параметр функции, НО значение аргумента функции НИКОГДА НЕ ОБНОВЛЯЕТСЯ, поэтому оно будет продолжать указывать на один и тот же объект во всем и даже после вызова функции (даже если его объект данные были изменены или если параметру функции назначен другой объект в целом). Неверно утверждать, что аргумент функции был передан по ссылке только потому, что указанный объект является обновляемым через переменную параметра функции.
Вызов / передача по ссылке : Значение аргумента функции может / будет обновляться напрямую соответствующим параметром функции. Если это помогает, параметр функции становится эффективным «псевдонимом» для аргумента - они фактически ссылаются на одно и то же значение в одной и той же ячейке памяти. Если аргумент функции является переменной объекта, возможность изменять данные объекта ничем не отличается от случая передачи по значению, поскольку параметр функции по-прежнему будет указывать на тот же объект, что и аргумент. Но в случае переменной объекта, если для параметра функции задан совершенно другой объект, аргумент также будет указывать на другой объект - этого не происходит в случае передачи по значению.
JavaScript не передается по ссылке. Если вы внимательно прочитаете, вы поймете, что все противоположные мнения неправильно понимают, что подразумевается под передачей по значению, и они ошибочно заключают, что способность обновлять данные объекта с помощью параметра функции является синонимом «передачи по значению».
Клонирование / копирование объекта : Создается новый объект и копируются данные исходного объекта. Это может быть глубокая или мелкая копия, но дело в том, что создается новый объект. Создание копии объекта является отдельным понятием от передачи по значению. Некоторые языки различают объект класса и структуры (или тому подобное) и могут иметь разное поведение для передачи переменных разных типов. Но JavaScript не делает ничего подобного автоматически при передаче объектных переменных. Но отсутствие автоматического клонирования объектов не означает переход по ссылке.