Когда я объявляю объект и внутри этого объекта я создал свойство, содержащее примитивное значение.
поэтому в этом примере
const foo = {
firstName: 'bar'
}
где на самом деле хранится полоса, она указывает на конкретную память в стеке и значение там, или оно хранится в том виде, в каком оно есть, по некоторому адресу в куче
@Pointy Да, я знаю это, но я спрашиваю о примитивном значении, которое хранится внутри объекта, который в данном случае «бар».
Его необходимо хранить в куче, поскольку объект и все примитивные значения, на которые он ссылается, могут пережить вызов функции.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда вы объявляете объект в JavaScript, сам объект сохраняется в куче. Это связано с тем, что объекты могут динамически увеличиваться в размерах, а куча обеспечивает такую гибкость.
Строка bar хранится в куче как часть объекта foo, а ссылка foo, указывающая на объект в куче, хранится в стеке.
Подробнее об этом можно узнать здесь https://thewikihow.com/video_9ooYYRLdg_g&t=493s
Вы используете скобочную запись и точечную запись. Вы можете использовать один из них одновременно. х['firstName'] = 'е'; x.firstName='e'
Частично это верно, но основная причина, по которой объект хранится в куче, заключается в том, что он может быть возвращен, например, из функции, а сохранение его в стеке будет означать его исчезновение при возврате из этой функции.
(Разработчик V8 здесь.)
Как правило, в JavaScript все значения, все объекты и все их свойства хранятся в куче.
Похоже, существует давний миф о том, что пользователи StackOverflow продолжают рассказывать друг другу о примитивных значениях, хранящихся в стеке. Это неверно, и несколько человек опубликовали объяснения, почему это не может работать (короче: области действия и время жизни). Примитивы не сохраняются в стеке, ни когда они являются свойствами объекта, ни когда-либо еще. Все значения хранятся в куче. Есть один или два очень старых ответа, которые утверждают обратное, а затем на них ссылаются десятки новых ответов, так что на данный момент это кажется самоподдерживающимся мифом (люди продолжают повторять то, что они прочитали в другом месте), но это не так. сделай это правдой.
Если вы настаиваете на придирках:
Есть один вид исключения из этого общего утверждения: это внутренние оптимизации движка, которые могут срабатывать или не срабатывать в определенных конкретных ситуациях, которые могут иметь или не иметь определенное значение в качестве одного из предварительных условий.
Например, как только функция становится достаточно горячей для оптимизации, оптимизирующий компилятор может распознавать неэкранированные локальные переменные и избегать обычного выделения кучи для значений, которые они содержат. Чаще всего это влияет на числовые значения, которые могут даже храниться только в регистрах ЦП (т. е. временные/промежуточные результаты вообще не будут записываться в память).
Вариантом этого является «эскейп-анализ» для объектов, который обнаруживает, что весь объект недолговечен и невидим вне функции, и может избежать выделения этого объекта; по сути, он превращает свои свойства в локальные переменные, когда может доказать, что это сохраняет наблюдаемое поведение.
Другой пример внутренней оптимизации, специфичной для движка, — это когда даже без оптимизирующего компилятора некоторое подмножество значений является особым во внутреннем представлении значений, что в некоторых ситуациях может сделать их пригодными для оппортунистического хранения в стеке. В зависимости от архитектурного выбора движка это может относиться к «Smis» (маленькие целые числа) или ко всем значениям Number или, возможно, даже к коротким строкам (не более нескольких символов); в V8 это только первый случай (Смис).
Но, чтобы внести ясность: ничто из этого не означает, что «примитивные значения хранятся в стеке». Суть в том, что иногда достаточно продвинутый движок может помещать в стек некоторые значения (примитивные или нет), которые обычно находятся в куче, в качестве ненаблюдаемой оптимизации. Простой движок этого не сделал бы, и ни один движок не может сделать этого для всех значений (или всех примитивов), потому что (1) стек слишком мал для этого и (2) время существования значений часто мешает этому. Ничто в JavaScript как языке ничего не говорит о размещении в стеке (примитивных) значений.
это код для динамически выделяемой памяти в куче в исходном коде v8, который находится на github, и я не знаю, хороший ли это запрос или нет, но я спрошу, есть ли шанс сделать на YouTube серию о внутренних компонентах v8, ваше объяснение очень-очень хорошее и вы исправите множество неправильно понятых представлений по этой теме.
Весь код V8 имеет открытый исходный код, вы можете найти его по адресу chromium.googlesource.com/v8/v8 , его отражение находится по адресу github.com/v8/v8 . В нашем блоге есть несколько статей, объясняющих разные вещи: v8.dev/blog.
могу ли я написать код Javascript и отладить его, хотя v8, чтобы получить на самом деле то, что происходит, возможно ли это
Объекты JavaScript выделяются из кучи, а не из стека.