Javascript 分配并立即删除属性

Javascript 分配并立即删除属性,javascript,Javascript,我不是javascript程序员,我对这段代码的功能和用途完全感到困惑: function map(x) { x = Object.create(null); x.x = 0; delete x.x; return x; } 这是使用dart2js编译器时得到的一部分 我不想理解整个上下文,但是分配属性并直接删除它有助于实现什么呢 这看起来比JS引擎的某些内部行为更令人兴奋 编辑:根据要求,这里是由dart2js生成的完整out.js(输入是来自维基百科的“He

我不是javascript程序员,我对这段代码的功能和用途完全感到困惑:

function map(x) {
    x = Object.create(null);
    x.x = 0;
    delete x.x;
    return x;
}
这是使用dart2js编译器时得到的一部分

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

这看起来比JS引擎的某些内部行为更令人兴奋

编辑:根据要求,这里是由dart2js生成的完整out.js(输入是来自维基百科的“Hello world!”示例):


编辑2:gurvinder372的链接表明它与“为了性能而委托匿名JS对象”有关,但我可能需要很多JS经验才能理解这一点。

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

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

V8可以很好地处理这样的细微差异,但是如果您的代码 将各种随机特性指定给来自同一个对象的对象 构造函数,或者如果删除属性,则 将对象放入字典模式,在其中存储属性 在哈希表中。这就避免了大量地图的出现 分配的


摘自这篇漂亮的文章

这段代码毫无意义。它需要一个直接被覆盖的参数——这是第一个“错误”。给一个属性赋值并删除它并不会改变任何东西。也许它是像
函数映射(x){x=x | |{}}
这样的代码的剩余部分,它应该确保没有设置某个属性,但是这样做也没有意义。你能引用原始代码吗@Blutkoete@lustoykov完成。这是一个性能微观优化。该函数的工作原理与
function map(){return Object.create(null);}
will相同-它创建一个空对象用作查找映射。此外,关于字典模式的优缺点,这个问题很有趣: