【问题标题】:Javascript: dictionary/object membership check speedJavascript:字典/对象成员检查速度
【发布时间】: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


【解决方案1】:

它们不一样

  • obj.prop 将检查属性是否不虚假(不是nullundefined0""false)。

  • prop in obj 检查对象(包括其原型链)中是否存在属性

  • 最后你有obj.hasOwnProperty('prop'),它检查对象是否有prop,因为它是自己的属性(不能是继承的)。

例子

var obj = { prop: "" };
obj.prototype = { inhereted: true };
if ( obj.prop );            // false
if ( prop in object );      // true
if ( inhereted in object ); // true
if ( obj.hasOwnProperty('prop') );      // true
if ( obj.hasOwnProperty('inhereted') ); // false

我认为,只要您一次不进行数百万次检查,性能就不应该成为问题。如果你真的想要最快的方法,你可以使用:

if ( obj.prop != null )

检查属性是否不是nullundefined。在这种形式中,""0 等其他虚假值不会干扰,而且您仍然表现出色。

【讨论】:

  • 我知道他们不一样。但令人惊讶的是,最简单的(至少在理论上)方法是最慢的。顺便说一句-我将 hasOwnProperty 方法添加到基准测试中以查看它的运行情况,它的速度与in 的速度大致相同。也有点令人惊讶,因为它涉及获取属性hasOwnProperty 并调用该函数。而in 只是一种语言结构。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多