javascript - 分配并立即删除属性

标签 javascript

我不是 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 的链接表明与“委托(delegate)给匿名 JS 对象以提高性能”有关,但我可能需要大量 JS 经验才能理解这一点。

最佳答案

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

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

V8 can handle minor divergences like this just fine, but if your code assigns all sorts of random properties to objects from the same constructor in no particular order, or if you delete properties, V8 will drop the object into dictionary mode, where properties are stored in a hash table. This prevents an absurd number of maps from being allocated.

摘自这篇不错的文章 A tour of V8: object representation

关于javascript - 分配并立即删除属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49876196/

相关文章:

javascript - 防止 AngularJS $http promise 返回缓存的 JSON 数据

javascript - 缓存过期 header CSS 和 JS 不工作

javascript - 正则表达式匹配对查询字符串

javascript - .append() 元素具有多个类

javascript - 出生日期输入屏蔽在三星设备上不起作用

javascript - 如何使用 CSS 和 JS 一次为多个模态添加进出过渡效果?

javascript - dojo.data.ItemFileReadStore : Invalid item argument with Dijit combobox

javascript - 使用 Google map 绘制巴士路线

javascript - 可拖动列表到 html5 表格中存在错误

javascript - React Router With Handler 显示空白页面