TGViewer
As For JS As For JS @asforjavascript · 3.08K subscribers
Post #1296 1.72K
Тема вопроса: "Передача значения по значению и по ссылке"
Итак JS понятия передачи по значению и по ссылке - нету или назвать сложно

Его именно НЕТ.
Спецификация ECMA не занимается тем, что регламентирует работу с памятью или способами представления этих структур данных в памяти.

Спецификация ECMA не может дать ответа на этот вопрос ПРИНЦИПИАЛЬНО.

Мы можем, опираясь на описание поведений для тех или иных statement или expression и для себя сделать вывод, - как бы для конкретной реализации языка (v8, Chakra, и т.д.) на основе данной спецификации было бы проще это реализовать.


Важный промежуточный вывод
Спецификация ECMA не может диктовать то, каким образом Вы передаете куда-дибо какие-либо данные, потому как это вне ее зоны ответственности.

А это значит, что если мы рассуждаем именно о ЯЗЫКЕ JavaScript - то мы НЕ ИМЕЕМ НИКАКОГО ПРАВА утверждать что в языке JS существует передача по ссылке или по значению. Просто потому, что в ней нет ничего и не может быть ничего что могло бы регламентировать эту работу.

И максимум о чем мы можем судить - КАК спецификация реализована в конкретном коде (например V8).

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


Разберем эти два направления: как реализовано в V8 и как мы можем интерпретировать спецификацию.

Начнем с ECMA.
В спецификации ECMA, любая передача чего-то куда, то управляется двумя конструкциями Reference Record и описанием взаимодейтсвия с ней. (Слово Reference ужу должно напрягать).
Где доступ к данным, выполняется через абстрактную операцию GetValue. Иными словами ни о каком разговоре о интерпретации этого как доступа по значению и мысли быть не может.

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

И описанием поведения инструкция let и set (не путайте с let в JS. Это разные вещи). Где в описании (ECMA ) инструкции let прямо написано
Algorithm steps may declare named aliases for any value using the form “Let x be someValue”. These aliases are reference-like in that both x and someValue refer to the same underlying data and modifications to either are visible to both.

Algorithm steps that want to avoid this reference-like behaviour

should explicitly make a copy of the right-hand side: “Let x be a copy of someValue” creates a shallow copy of someValue.
Вместо ИГОГО по части спецификации ECMA
передача чего-то по значению, принципиально невозможна, кроме случаев указанных для be a copy. Которые касаются особых поведений для Shared Array или Typed Array.

А именно меньше 1% спецификации. Или того, чем Вы в большистве своем никогда не пользуетесь. То есть того что не касается "традиционного JavaScript"


Дальше берем конкретную реализацию ECMA спецификации, а именно самую ее популярную и развитую - V8.

Где по умолчанию ВСЕ данные в JS являются Object. И исключением являются только особые случаи оптимизации поведения, когда reference может вместо самого себя как value разместить SMI или Floating Point Value.

что является частной оптимизацией поведения конкретно реализации.


ИГОГО
Как на уровне спецификации языка, так и на уровне ее реализации и речи не может идти о интерпретациях вида: передачи чего то по ссылке и чего-то по значению.

Это же можно обозначить еще и другим примером:

Если для Вас передача по значению, это работа с Primitive Value, то обьясните мне и себе каким образом передаются Symbol или BigInt.

Которые являются чистыми абстракциями, то есть никаких реальных Value на уровне реализации в машинном коде, иметь не могут.

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

https://t.me/AsForJsTalks/251239
v8.dev The story of a V8 performance cliff in React · V8 This article describes how V8 chooses optimal in-memory representations for various JavaScript values, and how that impacts the shape machinery — all of which helps explain a recent V8 performance cliff in React core.
  • 🔥 8
  • 🙏 4
  • ❤ 3
More from @asforjavascript
  1. Oct 8, 2026https://www.youtube.com/watch?v=ItxfZCmdaSI&list=OLAK5uy_lVqIIi_ibuhCtw6SMTo6bUpeJ6iyVXGuM…
  2. Oct 6, 2026https://youtu.be/rfUEstWJUkA?si=8oyCWfdr2omi69ay
  3. Oct 5, 2026Я все еще еще... Запомните меня таким.
  4. Oct 3, 2026Доброго вам Утрааааа
  5. Oct 3, 2026Архив орг, вводит ограничение до двух публикаций в месяц от одного автора. https://blog.ar…
  6. Oct 2, 2026Если я пропустил за предыдущие 100500 сообщений, что-то, что было для Вас важно - тыкнете…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →