Где на самом деле хранятся примитивы внутри объектов

Когда я объявляю объект и внутри этого объекта я создал свойство, содержащее примитивное значение.

поэтому в этом примере

const foo =  {
  firstName: 'bar'
}

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

Объекты JavaScript выделяются из кучи, а не из стека.

Pointy 18.08.2024 05:25

@Pointy Да, я знаю это, но я спрашиваю о примитивном значении, которое хранится внутри объекта, который в данном случае «бар».

Yousef Dawood 18.08.2024 05:58

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

Barmar 18.08.2024 07:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Строка bar хранится в куче как часть объекта foo, а ссылка foo, указывающая на объект в куче, хранится в стеке.

Подробнее об этом можно узнать здесь https://thewikihow.com/video_9ooYYRLdg_g&t=493s

Вы используете скобочную запись и точечную запись. Вы можете использовать один из них одновременно. х['firstName'] = 'е'; x.firstName='e'

abuzain 18.08.2024 06:52

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

A Haworth 18.08.2024 12:30
Ответ принят как подходящий

(Разработчик V8 здесь.)

Как правило, в JavaScript все значения, все объекты и все их свойства хранятся в куче.

Похоже, существует давний миф о том, что пользователи StackOverflow продолжают рассказывать друг другу о примитивных значениях, хранящихся в стеке. Это неверно, и несколько человек опубликовали объяснения, почему это не может работать (короче: области действия и время жизни). Примитивы не сохраняются в стеке, ни когда они являются свойствами объекта, ни когда-либо еще. Все значения хранятся в куче. Есть один или два очень старых ответа, которые утверждают обратное, а затем на них ссылаются десятки новых ответов, так что на данный момент это кажется самоподдерживающимся мифом (люди продолжают повторять то, что они прочитали в другом месте), но это не так. сделай это правдой.


Если вы настаиваете на придирках:
Есть один вид исключения из этого общего утверждения: это внутренние оптимизации движка, которые могут срабатывать или не срабатывать в определенных конкретных ситуациях, которые могут иметь или не иметь определенное значение в качестве одного из предварительных условий.
Например, как только функция становится достаточно горячей для оптимизации, оптимизирующий компилятор может распознавать неэкранированные локальные переменные и избегать обычного выделения кучи для значений, которые они содержат. Чаще всего это влияет на числовые значения, которые могут даже храниться только в регистрах ЦП (т. е. временные/промежуточные результаты вообще не будут записываться в память).
Вариантом этого является «эскейп-анализ» для объектов, который обнаруживает, что весь объект недолговечен и невидим вне функции, и может избежать выделения этого объекта; по сути, он превращает свои свойства в локальные переменные, когда может доказать, что это сохраняет наблюдаемое поведение.
Другой пример внутренней оптимизации, специфичной для движка, — это когда даже без оптимизирующего компилятора некоторое подмножество значений является особым во внутреннем представлении значений, что в некоторых ситуациях может сделать их пригодными для оппортунистического хранения в стеке. В зависимости от архитектурного выбора движка это может относиться к «Smis» (маленькие целые числа) или ко всем значениям Number или, возможно, даже к коротким строкам (не более нескольких символов); в V8 это только первый случай (Смис).

Но, чтобы внести ясность: ничто из этого не означает, что «примитивные значения хранятся в стеке». Суть в том, что иногда достаточно продвинутый движок может помещать в стек некоторые значения (примитивные или нет), которые обычно находятся в куче, в качестве ненаблюдаемой оптимизации. Простой движок этого не сделал бы, и ни один движок не может сделать этого для всех значений (или всех примитивов), потому что (1) стек слишком мал для этого и (2) время существования значений часто мешает этому. Ничто в JavaScript как языке ничего не говорит о размещении в стеке (примитивных) значений.

это код для динамически выделяемой памяти в куче в исходном коде v8, который находится на github, и я не знаю, хороший ли это запрос или нет, но я спрошу, есть ли шанс сделать на YouTube серию о внутренних компонентах v8, ваше объяснение очень-очень хорошее и вы исправите множество неправильно понятых представлений по этой теме.

Yousef Dawood 19.08.2024 19:12

могу ли я написать код Javascript и отладить его, хотя v8, чтобы получить на самом деле то, что происходит, возможно ли это

Yousef Dawood 21.08.2024 12:18

Другие вопросы по теме