【问题标题】:Will result from Object.assign be in dictionary mode if I use slow mode objects?如果我使用慢速模式对象,Object.assign 的结果是否会处于字典模式?
【发布时间】:2019-01-15 23:38:01
【问题描述】:

如果我有一个处于“慢速模式”或字典模式的对象,当我使用 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 源代码。
  • @JackBashford 没有,但基本上只有快速/字典两种模式
  • @FelixKling v8 是将对象置于慢速模式的版本,v8.dev/blog/fast-properties

标签: javascript ecmascript-6 v8


【解决方案1】:

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

您可以通过运行带有--allow-natives-syntax 标志的d8(或节点),然后使用特殊函数%HasFastProperties(bar) 自己验证这一点。

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

具体来说,我不知道这是否是你问的原因,所以我想先发制人地说,我强烈建议反对构建任何自定义“强制快速模式”帮助程序复制对象——这很可能会消耗更多的时间和内存而不是节省的时间,并且可能会突然停止做你认为它所做的事情,而你甚至都不知道。

这里的大局是“快速属性”和“慢速属性”是用词不当。更好的术语是“快速读取属性”和“快速修改属性”:delete 语句(通常)将对象转换为字典模式的原因是因为添加和删除属性很多 当对象处于字典模式时比它处于(名称不好的)“快速属性模式”时更快。在大多数情况下,V8 的启发式算法在为您的对象选择正确的内部模式方面做得很好,您通常可以专注于编写干净的代码,而不用担心引擎内部。

(如果就像有一个“好案例”和一个“坏案例”那么简单,那么 V8 根本就没有一个“坏案例”,你会希望有一个标志 --always-good-case(或者只是--dont-be-silly),对吗?;-) 现实情况是,这是一种权衡:“对一件事有利”与“对另一件事有利”。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 2021-09-30
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多