如果我使用慢速模式对象,Object.assign 的结果会处于字典模式吗?

Will result from Object.assign be in dictionary mode if I use slow mode objects?

如果我有一个处于 "slow mode" 或字典模式的对象,当我使用 Object.assign 时,结果会处于快速模式吗?

示例:

const foo = {'first': 1, 'second': 2}; // fast mode
delete foo.first; // puts foo in slow mode

const bar = Object.assign({}, foo);// will object bar be in slow mode?

(此处为 V8 开发人员。)简短回答:在此示例中,bar 具有 "fast" 属性。

您可以通过 运行 d8(或节点)和 --allow-natives-syntax 标志自行验证,然后使用特殊函数 %HasFastProperties(bar).

也就是说,这是一个内部实施细节,可能会随着时间的推移而发生变化。它不应该是您的代码应该有理由关心的事情。

具体来说,我不知道这是否就是你问的原因,所以我想先发制人地说,我强烈建议 反对 构建任何自定义 "force fast mode" 复制对象的助手——很有可能,这会消耗比节省更多的时间和内存,并且可能会在您不知情的情况下突然停止做您认为它会做的事情。

这里的大局是 "fast properties" 和 "slow properties" 是用词不当。更好的术语是 "fast-to-read properties" 和 "fast-to-modify properties":delete 语句(通常)将对象转换为字典模式的原因是因为添加和删除属性要快得多 当对象处于字典模式时比处于(错误命名)"fast-property mode" 时要好。在大多数情况下,V8 的启发式算法在为您的对象选择正确的内部模式方面做得很好,您通常可以专注于编写干净的代码,而不用担心引擎内部。

(如果它像 "good case" 和 "bad case" 一样简单,那么 V8 根本没有 "bad case" 就太傻了,你会希望有一个标记 --always-good-case(或只是 --dont-be-silly),对吗?;-) 现实是这是一个权衡:"good for one thing" vs "good for another thing"。)