我不是javascript程序员,我完全不知道这段代码的作用及其用途:
function map(x) {
x = Object.create(null);
x.x = 0;
delete x.x;
return x;
}
这是使用 dart2js 编译器时所获得的一部分。
我并不是想了解整个上下文,但分配属性并直接删除它有助于实现?
这看起来像是超越了一些内部JS引擎行为。
编辑:根据要求,这是 dart2js 生成的完整 out.js (输入是“Hello world!”示例来自维基百科):https://gist.github.com/Blutkoete/59be155b2642832e9acd383df0857d02
编辑2 :gurvinder372的链接指示与“委托匿名JS对象的性能”有关,但我可能需要很多JS的经验才能理解。
答案 0 :(得分:4)
嗯......这是一个有趣的话题,理解这个技巧需要阅读一下V8编译器的对象表示。我不是这方面的专家,但主题很有趣,足以引起我寻找答案。所以这就是我找到的。
首先,删除属性似乎是一种改变对象属性保存和访问方式的内部结构的技巧。换句话说,删除属性会将对象切换到字典模式,其中属性保存在哈希映射中。因此,在创建虚拟属性后立即删除虚拟属性会以字典模式为您提供对象。
V8可以处理这样的小分歧,但是如果您的代码 将各种随机属性分配给来自相同的对象 构造函数没有特定的顺序,或者如果删除属性,V8 将对象放入字典模式,其中存储属性 在哈希表中。这可以防止出现荒谬的地图数量 分配