【发布时间】:2011-05-01 10:01:31
【问题描述】:
我很好奇检查 JS 对象(用作字典)是否具有给定属性的最快方法是什么。
我对结果感到困惑。自己看:http://jsperf.com/object-membership-check-speed/6
在 Chrome 中,in 关键字方法比点语法慢 96%。
在 Firefox 中,它也慢了大约 80%。 IE 显示速度慢了大约 50%
什么鬼?难道我做错了什么? 我想象“in”关键字会被优化,因为它甚至不需要获取值,它只返回一个布尔值。但显然我完全错了。
【问题讨论】:
-
在 Firefox 4.0b6/Windows 中对我来说差别不大:数组语法最快,点语法慢 3%,'in' 关键字慢 10%。
-
为了一笑而过,尝试在 IE8 中运行它。你会厌倦关闭“这个脚本运行缓慢。你想结束它吗?”对话框。根据记录,IE8 的运行速度比 Chrome 慢约 60 倍。 :)
-
为了记录,他们都“得到”了这个值,因为他们必须确定这样一个值是否存在(所以 必须返回一些东西),并且每种方式都必须访问特定成员。
-
@Robusto 是的,忘记 IE。我还想知道 IE 的测试结果是否存在缺陷,因为在对话框打开时计时器可能不会停止。但是
in关键字与其他方法有点不同,因为即使键的值已显式设置为undefined,它也会返回true。使用其他方法,我认为甚至无法检查是否已明确设置某些内容 -
@Robusto - 不管内部发生什么,
in运算符不需要返回所述属性的值。直观地说,in似乎是最快的,因为检查一个属性是否已被定义似乎是获取其值的必要的第一步,因此您会认为in要做的工作比其他选择要少。但是,优化很少是直观的,可能只是更常见的用例是经过更深入优化的用例。
标签: javascript performance optimization