假设您对一个对象进行了更改,该更改会触发存储哈希值的基础数组或数据结构的大小发生更改。
var x = { a: 1, b: 2, c: 3 }
// trigger a resize theoretically
x.d = 4
x.e = 5
x.f = 6
假设哈希的底层数组在 v8 中看起来像这样
[ 1, 3, 2, null, null ]
它最初创建了一些额外的空间。但这还不够,所以它必须增长。有两种选择。
- 它会增长,将原始值保留在当前位置。
- 它不断增长并重新散列,将值移动到任意新位置。
所以它看起来像:
// (1) 1, 3, 2 stay where they are
[ 1, 3, 2, 6, 4, 5, null, null, null, null ]
// (2) 1, 3, 2 are moved
[ 6, 2, 5, 3, 4, 1, null, null, null, null ]
想知道 v8 在这种情况下会做什么。还想知道调整大小的启发式是什么(当数组大小超出时是否将其加倍,等等)。
最佳答案
V8 引擎使用两种对象表示:
快速模式通常对于属性访问要快得多 - 但需要知道对象的结构。
V8 最初会尝试构造一个对象的模板,称为“隐藏类”。该对象将通过隐藏类进行转换,直到 V8 放弃并将该对象存储为慢速属性。
我通过“How does Bluebird's util.toFastProperties function make an object's properties “fast”? ”中的相关代码更深入地探讨了这一点。
至于你的直接问题,该对象将 "fast assign"在这些属性分配上(在每个这样的分配上)并迁移到不同的映射(根据需要复制内存)。
关于javascript - 如果 v8 在对象增长时重新哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011721/