JavaScript之间的性能差异等于(==)和三等于(===)

在JavaScript中,使用double equals( == )与使用triple equals( === )之间是否存在性能差异?

例如: if (foo == bar) vs if (foo === bar)

严格比较( === )总是会稍微快一点,但差异通常可以忽略不计 。

如果你确实知道在比较中你不需要types强制,那么肯定有意义。 它总是至less和==一样快。

  • 如果比较的types是相同的, 它们是相同的 。 也就是说,他们使用完全相同的algorithm

  • 如果types不同 ,那么性能是不相关的。 要么你需要强制types,要么你不需要。 如果你不需要它,不要使用==因为你得到的结果可能是意想不到的。

编辑:这里的参考由Axel Rauschmayer博士的规格说明http://www.2ality.com/2011/06/javascript-equality.html真的很好写了。

=== (严格平等):只考虑具有相同types的值。

  1. undefined === undefined,null === null,
  2. NaN ===没有包括本身,
  3. Primitive [Number | String | Boolean] ===原始值相等,
  4. 自我(+0 === -0)
  5. 两个对象[数组|对象|函数] ===只有自己(同一个确切的实体)

== (宽容平等)

  1. 如果两个值具有相同的types:与===进行比较。
  2. undefined == null
  3. 数字和string:string=>数字和比较
  4. 布尔值和非布尔值=>非布尔值编号和比较
  5. string或数字=>一个对象:将对象转换为图元和比较。

在所有现代的Javascript环境中,它们都是完全不同的。 简单来说, ==通过将给定variables转换为基元(string,数字,布尔值)来testing相似性。 ===严格相同性的testing,意思是完全相同的对象或原始值,无需转换。

如果你objOne == objTwo实际发生的是[[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())

valueOf的parsing可能会有所涉及,在JS中暴露的函数和内部引擎的东西之间反弹。 只要说比较总是以强制原始的两个值为结束,否则就会抛出一个错误。

编辑: EQUALS实际上首先尝试STRICT_EQUALS ,它抢占了其余的过程。

有趣的是,valueOf(和它的合作伙伴toString)是可覆盖的。 在Chrome中运行这段代码(我认为任何webkit,不知道JSC和V8是否共享这个小技巧)。 它会吹你的想法:

 var actions = []; var overload = { valueOf: function(){ var caller = arguments.callee.caller; actions.push({ operation: caller.name, left: caller.arguments[0] === this ? "unknown" : this, right: caller.arguments[0] }); return Object.prototype.toString.call(this); } }; overload.toString = overload.valueOf; overload == 10; overload === 10; overload * 10; 10 / overload; overload in window; -overload; +overload; overload < 5; overload > 5; [][overload]; overload == overload; console.log(actions); 

输出:

 [ { operation: 'EQUALS', left: overload, right: 10 }, { operation: 'MUL', left: overload, right: 10 }, { operation: 'DIV', left: 'unknown', right: overload }, { operation: 'IN', left: overload, right: DOMWindow }, { operation: 'UNARY_MINUS', left: overload, right: undefined }, { operation: 'TO_NUMBER', left: overload, right: undefined }, { operation: 'COMPARE', left: overload, right: 5 }, { operation: 'COMPARE', left: 'unknown', right: overload }, { operation: 'ToString', left: 'unknown', right: overload } ] 

=====之间的区别的本质是由===不显示在列表中。 它完全跳过JavascriptLand的旅程。 比较性能时,这种冒险是昂贵的。

但是,您需要考虑引擎优化。 对于大多数对象,引擎将能够切断大部分步骤,并保持在NativeLand中,并获得几乎相同的性能。 但是这不是一个保证,如果某些东西阻止引擎能够使用优化,代码中的一些幻想或者覆盖内置的或者无数的问题,那么您立即就可以看到性能的结果。 ===强制它。

===就是Javascript中唯一不可变的东西。

由于性能,我认为'==='有更好的performance,因为'==='比'=='严格,

例如在Chrome控制台中尝试以下内容。

 > 1 == '1' true > 1 === '1' false 

'=='必须检查比'==='更多的东西

从一些脆弱的testing, ==似乎比===快。

勉强,我的意思是,我可以看到几百万次testing的差异几毫秒的差异。 你不可能需要性能增益,而不是使用任何最正确的手头任务。

编辑:其实,似乎取决于/你在比较和浏览器的实现。 换句话说,别担心。