【问题标题】:Are the keys of JavaScript Objects stored in memory?JavaScript 对象的键是否存储在内存中?
【发布时间】:2020-07-30 20:13:33
【问题描述】:

我想知道它是否使用更多内存来存储具有相同键的对象数组,而不是仅存储包含值的数组数组。

const arrayOfObjects = [
    {key1: "val1",      key2: "val2",       key3: "val4",       key4: "val5"},
    {key1: "value1",    key2: "value2",     key3: "value4",     key4: "value5"},
    {key1: "value-1",   key2: "value-2",    key3: "value-4",    key4: "value-5"}
]
const arrayOfArrays = [
    ["val1",    "val2",     "val3",     "val4"],
    ["value1",  "value2",   "value3",   "value4"],
    ["value-1", "value-2",  "value-3",  "value-4"]
]

arrayOfObjects 会比 arrayOfArrays 占用更多的内存吗? 更准确地说,密钥是否也存储在内存中? 另外,我经常使用 JS Objects 来制作哈希表,以加速算法,但这样做的限制是什么? 感谢您的帮助。

【问题讨论】:

标签: javascript hashmap javascript-objects hashtable heap-memory


【解决方案1】:

JavaScript 本身并没有指定对象的内存布局,但所有常见的实现都使用类似于object shapes of the V8 engine 的东西。由于所有对象都具有相同的形状,因此它们的属性名称将只存储一次,并由数组中的所有对象共享,无论有多少对象。与数组相比的开销(如果有的话)在您的算法/数据结构设计中不值得考虑。

我经常使用 JS Objects 来制作哈希表,来加速算法,但是这样做有什么限制呢?

如果您动态添加太多属性,甚至delete 它们,引擎将使用不同的对象表示。但是,对于哈希表,您应该在现代 javascript 中使用 Map,它从头开始针对此用例进行了优化,并且比对象更有效。

【讨论】:

    【解决方案2】:

    与 C 语言中的结构成员名称在编译时解析不同,JavaScript 属性名称是动态的,可以在运行时更改。所以它们必须存储在对象的内存中。 JavaScript 对象通常实现为哈希表,属性名称作为表中的字符串键。

    但是,如果您在多个对象中使用相同的属性名称,则通常只会有该字符串的一个副本,由所有对象共享。见Do common JavaScript implementations use string interning?。因此字符串存储在内存中,但不会为每个对象重复。

    实现对象的代码经过高度优化,因为您对它们的使用是典型的并且需要高性能。

    【讨论】:

    • "它们必须存储在对象的内存中。" - 不,只能在对象中存储对它们的引用,共享名称字符串的内存.这正是OP所要求的。如果您不能证实属性名称直接存储在对象内存中的说法,我认为这个答案没有用。
    • 你说得对,我没有意识到 JS 实习生字符串文字。我已经更新了答案以反映这一点。
    • @Bergi 但他的问题的答案仍然是肯定的。共享字符串仍在内存中。当我读到这个问题时,我认为他来自 C 背景,其中成员名称根本不存在于运行时内存中,并且想知道 JS 是否是这样的。
    猜你喜欢
    • 2020-06-18
    • 2012-12-14
    • 2021-11-25
    • 2019-11-12
    • 2021-04-15
    相关资源
    最近更新 更多