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

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

Примитивные типы

Javascript — это язык с динамической типизацией, что означает, что переменные могут иметь значение любого типа данных. Тип данных переменной назначается в соответствии с ее значением, и мы используем оператор typeOf(), чтобы узнать тип данных. Существует от 5 до 7 примитивных типов данных в зависимости от стандарта ECMAScript, поддерживаемого браузером.

  1. логический
  2. нить
  3. число
  4. нулевой
  5. неопределенный
  6. символ (ES2015)
  7. большойинт (ES2020)

Ссылочные типы

Помимо примитивных типов данных, существует только один тип данных, объект, также известный как ссылочный тип. Переменные ссылочного типа имеют набор пар ключ-значение, также известный как свойства переменной/объекта. Объект определяется со своими свойствами в фигурных скобках. Следующий код определяет объект student с двумя его свойствами, nameи age

Где хранятся значения?

В приведенном выше коде num,fruit,иnum2имеют значения примитивного типа, а studentимеет значение ссылочного типа.

Значения ссылочного типа (объекты) хранятся в памяти кучи, в отличие от значений примитивного типа, которые хранятся в контексте выполнения в стеке вызовов. Для объекта стек вызовов сохраняет его адрес памяти кучи в качестве значения.

Картинка ниже может помочь нам понять хранение значений —

Передать по значению и передать по ссылке

В JavaScript мы передаем функции только значения в качестве параметров, но когда мы передаем объект, мы передаем его адрес в качестве значения. Любые изменения, внесенные в параметр примитивного типа, не влияют на исходное значение, но любые изменения, внесенные в свойство параметра ссылочного типа, изменяют фактическое значение свойства объекта.

Давайте поймем это с помощью кода ниже —

year — это значение примитивного типа, когда оно передается функции, любые изменения, внесенные в него функцией, не влияют на исходное значение, поскольку копия значения передается в функцию. Следовательно, его копия увеличивается на 1. В то время как johnobject является ссылочным типом, его адрес передается в качестве значения функции _10, функция вносит изменения непосредственно в объект, на который указывает адрес, переданный в качестве значения. Таким образом, значение свойства age увеличивается на 1.

Заключение

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

Ресурсы

https://www.javascripttutorial.net/javascript-типы данных/

https://www.udemy.com/course/the-complete-javascript-course

https://gist.github.com/

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord. Заинтересованы в Взлом роста? Ознакомьтесь с разделом Схема.