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

时间:2011-11-08 00:57:56

标签: javascript node.js performance browser comparison

在JavaScript中,使用双等号(==)与使用三等号(===)之间是否存在性能差异?

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

6 个答案:

答案 0 :(得分:40)

  • 如果比较的类型相同, 它们是相同的 。也就是说他们使用 完全相同的算法

  • 如果类型不同,则性能无关紧要。要么你需要类型强制,要么你不需要。如果您不需要,请不要使用==,因为您获得的结果可能是意外的。

答案 1 :(得分:26)

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

如果您确定在比较中不需要类型强制,那么首选===是绝对有意义的。它始终至少与==一样快。

答案 2 :(得分:14)

编辑以供参考,这是Axel Rauschmayer博士的 by spec 解释 http://www.2ality.com/2011/06/javascript-equality.html 非常好写。

===(严格平等):仅考虑具有相同类型的相等值。

  1. undefined === undefined,null === null,
  2. NaN ===不包括其自身,
  3. Primitive [Number | String | Boolean] ===原始值相等,
  4. to self(+0 === -0)
  5. 两个对象[Array | Object | Function] ===只有self(相同的实体)
  6. ==(宽恕平等)

    1. 如果两个值具有相同的类型:与===。比较。
    2. undefined == null
    3. number and string:string =>数字和比较
    4. 布尔值和非布尔值=>非布尔数字和比较
    5. 字符串或数字=>对象:将对象转换为基元和比较。
    6. 在所有现代Javascript环境中,它们的实现完全不同。简单来说,==通过将给定变量转换为基元(字符串,数字,布尔值)来测试相似性。 ===测试严格相同性,这意味着完全相同的Object或原始值而不进行转换。

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

      valueOf的分辨率可能会有所涉及,在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中唯一不可变的东西。

答案 3 :(得分:3)

由于效果,我认为===的效果更好,因为=====更严格,

e.g。在Chrome控制台中尝试以下操作。

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

==必须检查的内容多于===

答案 4 :(得分:1)

从一些脆弱的测试中,==似乎比===略快。

稍微说,我的意思是我可以看到数百万次测试的内部差异几毫秒。你可能不需要获得性能提升,而不是使用对手头任务最正确的任何东西。

编辑:实际上,似乎依赖于/您/您正在进行比较和浏览器实施。换句话说,不要担心。

答案 5 :(得分:0)

这取决于要比较的项目。由于“ ===”比“ ==”更严格,因此返回“ false”比“ ==”更快。但是,如果两个项目严格相等,则“ ===”应该比“ ==”花费更多的时间,因为它必须检查更多属性是否相等。