gpt4 book ai didi

javascript - 在内存中可视化的对象结构

转载 作者:行者123 更新时间:2023-11-30 14:08:49 24 4
gpt4 key购买 nike

我正在尝试描绘 Javascript 对象在内存中的放置方式。既然是对象,就存放在内存的堆部分。它也是键值对的集合。

现在,我有一个问题,Javascript 对象是作为链表结构实现的吗?还是其他原因?

这里我做了一张图片,从这段代码映射到内存中:

var o  = {} 
var o1 = { a: 1, b: o }

enter image description here

因此,关注 o1,有一个内存段引用了值 1,我们将该空间命名为 a。此外,属性 b 具有另一个对象的地址。

我的问题是:这是映射到内存中的 Javascript 对象的准确表示吗?如果不是,我错过了什么?

最佳答案

从根本上说,我认为你的图表基本上是正确的,至少在主要思想上是这样的,即对象是一个定义好的内存区域,其属性有槽。

实际的内存结构未由规范定义,并且可能因 JavaScript 引擎而异。

什么规范has to say是吗

An Object is logically a collection of properties.

...您的 ab 等数据属性具有名称和值。 1 是一个值,一个对象是一个值(稍后会详细介绍)。该规范没有涉及如何从不同位置引用值的问题。

实际的现代 JavaScript 引擎会创建动态类来优化属性访问,因为属性访问是一种非常常见的操作。它们还通过对象引用 处理对象,这些值表示实际对象在内存中其他地方的引用。在现代引擎中,您的对象很可能是用 ab 的内存槽实现的,它们的大小可能都是 64 位(但我不知道,那可能会有所不同),并且值 1 直接存储在槽中,b 的对象引用(再次指向内存中其他地方的对象)也直接存储在槽中。细节因引擎而异。

因此,例如,您的代码可能会在内存中创建类似这样的内容(遗漏了很多细节):

                                    +−−−−−−−−−−+o: Ref33454−−−−−−−−−−−−−−−−−−−−−−+−>| (Object) |                                 |  +−−−−−−−−−−+                                 |  +−−−−−−−−−−+                                 |                +−−−−−−−−−−−−−−+ |o2: Ref54612−−−>|   (Object)   | |                +−−−−−−−−−−−−−−+ |                | a: 1         | |                | b: Ref33454  |−+                +−−−−−−−−−−−−−−+

边注:

Since it is an object, it is stored on the heap part of the memory.

这不是一个有效的假设。例如,如果这发生在一个函数中,并且该函数被使用得足够多以至于 JavaScript 引擎决定积极优化它,V8 使用的一种优化(至少)是确定一个对象的生命周期是否完全包含在该函数中调用,如果是,则在堆栈上分配它,因为堆栈分配和清理非常快。因此,一个对象完全有可能在堆栈上而不是在堆中(而且,如果我没记错的话,如果有必要,它可能会从堆栈复制到堆中,因为在某些代码路径中它在函数调用结束后仍然存在)。

关于javascript - 在内存中可视化的对象结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54855288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com