【问题标题】:Assign and immediately delete property分配并立即删除属性
【发布时间】:2018-04-17 10:52:12
【问题描述】:

我不是 javascript 程序员,我完全不知道这段代码的作用和用途:

function map(x) {
    x = Object.create(null);
    x.x = 0;
    delete x.x;
    return x;
}

这是您使用 dart2js 编译器时获得的一部分。

我并不是想了解整个上下文,但是分配属性并再次直接删除它有助于实现什么?

这看起来比一些内部 JS 引擎行为更聪明。

EDIT:根据要求,这是由 dart2js 生成的完整 out.js(输入是“Hello world!”示例维基百科):https://gist.github.com/Blutkoete/59be155b2642832e9acd383df0857d02

编辑 2:gurvinder372 的链接表明与“委托给匿名 JS 对象以提高性能”有关,但我可能需要大量的 JS 经验才能理解这一点。

【问题讨论】:

  • 这段代码根本没有多大意义。它需要一个直接被覆盖的参数——这是第一个“错误”。给属性赋值并在之后删除它并没有真正改变任何东西。也许它是像 function map(x) { x = x || {}; } 这样的代码的剩余部分,它应该确保没有设置某个属性 - 但那样做也没有意义
  • 可以参考原代码吗? @Blutkoete
  • @lustoykov 完成。
  • 这是一个性能微优化。该函数的工作方式与function map() { return Object.create(null); } 相同 - 它创建一个空对象用作查找图。

标签: javascript


【解决方案1】:

嗯...这是一个有趣的话题,理解这个技巧需要阅读一点 V8 编译器的对象表示。我不是这方面的专家,但这个话题很有趣,足以吸引我去寻找一些答案。所以这就是我发现的。

首先,删除属性似乎是一种改变对象属性保存和访问方式的内部结构的技巧。换句话说,删除属性会将对象切换到字典模式,其中属性保存在哈希映射中。因此,当虚拟属性在创建后立即被删除时,会为您提供字典模式下的对象。

V8 可以很好地处理这样的细微差异,但是如果您的代码 将各种随机属性分配给同一对象 构造函数没有特定的顺序,或者如果你删除属性,V8 将对象放入字典模式,其中存储属性 在哈希表中。这可以防止荒谬的地图数量 已分配。

取自这篇好文章A tour of V8: object representation

【讨论】:

猜你喜欢
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多