双等号(= =)和三重平等之间的JavaScript性能差(===)

问题描述 投票:36回答:6

在JavaScript中,有没有使用双等号(==)与用三等于(===)之间的性能差异?

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

javascript node.js performance browser comparison
6个回答
28
投票

严格比较(===)总是会稍快一些,但the difference is usually negligible

这肯定是有道理的喜欢===如果你肯定知道你并不需要强制类型转换的比较。这将永远是至少一样快==


41
投票
  • 如果比较的类型相同,它们是相同的。也就是说,他们使用相同的算法。
  • 如果类型不同,则表现无关。要么你需要强制类型转换,或者你没有。如果你不需要它,不要用==因为你得到的结果可能是意想不到的。

14
投票

编辑:供参考这里由阿克塞尔博士Rauschmayer先生真的http://www.2ality.com/2011/06/javascript-equality.html很大写了规范的解释是的。

===(全等):仅认为具有相同的类型值相等。

  1. 未定义===未定义,为null ===空,
  2. 为NaN ===没有包括它本身,
  3. 原始[号码|字符串|布尔] ===原始值相等,
  4. 自我(+0 === -0)
  5. 两个对象[阵列|对象|功能] ===只有自我(完全相同的实体)

==(宽松平等)

  1. 如果两个值具有相同的类型:比较===。
  2. 未定义== NULL
  3. 数和字符串:字符串=>号,并比较
  4. 布尔值和非布尔=>非布尔到数并比较
  5. 字符串或数字=>的对象:对象转换到原始和比较。

在所有现代JavaScript环境得到实施完全不同的。简单地说,通过给定的转换变量分为原语(字符串,数字,布尔值)为== alikeness测试。 ===试验严格同一性,这意味着完全相同的对象或无需转换原始值。

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

的valueOf的分辨率可以在一定程度上参与,在JS和内部发动机东西暴露功能之间弹跳。我只想说,比较将始终与裹挟到原始的或者错误将被抛出两个值结束。

编辑:EQUALS实际上是尝试STRICT_EQUALS其中第一个抢占过程的其余部分。

这里有趣的一点是,的valueOf(及其合作伙伴的toString)是重写。运行这段代码在Chrome(我觉得任何的webkit,如果JSC和V8分享这珍闻不知道)。它会打击你的mindpiece:

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,并得到几乎相同的性能。但是,这并不能保证,如果发生防止发动机能够使用的最优化,一些fancyness在你的代码或重写建宏或种种问题,那么你就可以立即看到结果的表现。 ===迫使它。

===只是在JavaScript代码中唯一不变的东西。


3
投票

由于表现,我认为===具有更好的性能,因为=====严格,

例如尝试在Chrome控制台下面。

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

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


1
投票

从一些站不住脚的测试,==似乎略高于===更快。

通过幅度不大,我的意思是,我可以看到的数以百万计的测试interations几毫秒的差别。你不可能需要的性能增益,而不是使用什么是最正确的手头的任务。

编辑:实际上,似乎取决于/什么/你比较和浏览器实现。换句话说,不要担心。


0
投票

这取决于所比较的项目。因为“===”是不是更严格的“==”,它应该返回false不是“==”更快。然而,如果这两个项目是严格相等“===”应该不是“==”更多的时间,因为它必须检查平等更多的属性。

© www.soinside.com 2019 - 2024. All rights reserved.