在 JS 内存中,对象是以块的形式存储的吗?
In JS memory are objects stored as a block?
我想知道是否有对象,例如
const numbers = {
a: 1,
b: 2,
c: 3
};
作为一个组存储在内存中,以便变量 'numbers' 在一个地方引用整个对象,或者如果它的每个单独的键都作为单独的项目存储在不同的地方,这些项目全部由许多单独的指针不知何故?谢谢
(此处为 V8 开发人员。)
简短的回答是:是的,至少在这种简单的情况下这是一个合理的假设。
更长的答案是它很复杂,而且完全是引擎内部的细节:不同的 JS 引擎和它们的不同版本,很可能会选择在内部以不同方式表示(大的、复杂的)对象。例如,V8 分别存储“命名”和“索引”对象属性,例如如果您有 numbers = {a: 111, b: 222, 0: 42, 1: 43}
,那么 42
和 43
将存储在远离 111
和 222
的位置。另一个例子是嵌套对象,可以肯定的是,“内部”对象将是一个单独的内存块,例如在 foo = {a: 1, b: 2, nested: {inner: 1, object: 2}}
中,foo
对象将有一个指向 nested
对象的指针。同时,您示例中的 numbers
变量显然必须指向内存中的 something ,因此总是有一个内存地址表示 对象 ;只是该对象的某些部分可能是远离那里的间接。
我想知道是否有对象,例如
const numbers = {
a: 1,
b: 2,
c: 3
};
作为一个组存储在内存中,以便变量 'numbers' 在一个地方引用整个对象,或者如果它的每个单独的键都作为单独的项目存储在不同的地方,这些项目全部由许多单独的指针不知何故?谢谢
(此处为 V8 开发人员。)
简短的回答是:是的,至少在这种简单的情况下这是一个合理的假设。
更长的答案是它很复杂,而且完全是引擎内部的细节:不同的 JS 引擎和它们的不同版本,很可能会选择在内部以不同方式表示(大的、复杂的)对象。例如,V8 分别存储“命名”和“索引”对象属性,例如如果您有 numbers = {a: 111, b: 222, 0: 42, 1: 43}
,那么 42
和 43
将存储在远离 111
和 222
的位置。另一个例子是嵌套对象,可以肯定的是,“内部”对象将是一个单独的内存块,例如在 foo = {a: 1, b: 2, nested: {inner: 1, object: 2}}
中,foo
对象将有一个指向 nested
对象的指针。同时,您示例中的 numbers
变量显然必须指向内存中的 something ,因此总是有一个内存地址表示 对象 ;只是该对象的某些部分可能是远离那里的间接。