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

双等于(==)和三等于(==)之间的JavaScript性能差异,javascript,node.js,performance,browser,comparison,Javascript,Node.js,Performance,Browser,Comparison,在JavaScript中,使用双等于(==)与使用三等于(==)之间是否存在性能差异 例如:if(foo==bar)vsif(foo==bar)由于性能原因,我认为==的性能更好,因为==比=更严格 e、 g.在Chrome控制台中尝试以下操作 > 1 == '1' true > 1 === '1' false =必须检查比==更多的东西严格的比较(==)总是稍微快一点,但是 如果您确定在比较中不需要类型强制,那么选择==显然是有意义的。从一些不可靠的测试来看,=似乎比=稍

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


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

由于性能原因,我认为
==
的性能更好,因为
==
=
更严格

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

> 1 == '1'
  true
> 1 === '1'
  false
=
必须检查比
==

更多的东西严格的比较(
==
)总是稍微快一点,但是


如果您确定在比较中不需要类型强制,那么选择
==
显然是有意义的。从一些不可靠的测试来看,
=
似乎比
=
稍微快一些

我的意思是,我可以在数百万次测试的迭代中看到几毫秒的差异。您不可能需要性能增益,而不是使用最适合手头任务的东西

编辑:实际上,这似乎取决于/您正在比较的内容/以及浏览器实现。换句话说,别担心。

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

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


编辑:以下是Axel Rauschmayer博士根据规范所做的解释,以供参考 写得真不错

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

  • 未定义===未定义,空===空
  • NaN===不包括其本身
  • 基元[数字|字符串|布尔]==基元值相等
  • 对自身(+0==-0)
  • 两个对象[数组|对象|函数]==仅自身(相同的精确实体)
  • =
    (宽大平等)

  • 如果两个值具有相同的类型:比较==
  • 未定义==null
  • 数字和字符串:字符串=>数字和比较
  • 布尔值和非布尔值=>非布尔值进行编号和比较
  • 字符串或数字=>对象:将对象转换为基本体并进行比较
  • 在所有现代Javascript环境中,它们的实现完全不同。简单来说,
    =
    通过将给定变量转换为原语(字符串、数字、布尔值)来测试有效性<代码>=测试严格的相同性,这意味着完全相同的对象或原语值,无需转换

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

    valueOf的解析可能有些复杂,在JS中公开的函数和内部引擎之间跳跃。只需说,比较总是以两个强制为原语的值结束,否则将抛出一个错误

    Edit:
    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);
    
    ==
    ==
    之间差异的本质可以通过该列表中未显示的
    ==
    来说明。它完全跳过了进入JavascriptLand的旅程。当比较性能时,这种冒险是昂贵的

    但是,您需要考虑引擎优化。对于大多数对象,引擎将能够省去大部分步骤并保持在NativeLand中,并获得几乎相同的性能。但这并不是一个保证,如果有什么东西阻止引擎使用优化、代码中的某些幻想或重写内置或大量问题,那么您会立即看到性能方面的结果<代码>=强制它


    =
    几乎是Javascript中唯一不变的东西。

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

    您永远不会注意到任何事情。继续前进。它们有不同的用途,“更高的性能”不在其中。这不是问题,当你想获得它们提供的功能时使用它们。推荐阅读:因为这仍然是这个问题的谷歌排名第一的结果,而且我没有看到任何测试结果,我将添加一个。运行4次的Node.js小测试的平均结果(2个操作符中的每个操作符总共测试800000000次)发现
    ==
    =
    快0.0027%。如果差异真的那么大的话,那么它比眨眼或人脑对平均刺激作出反应的时间快10000倍左右。为了支持轨道上的轻量级比赛,我想不出任何一种情况下,人类可能会注意到两者之间的速度差异。@Jonsurll感谢有趣的链接:)五年后,很有趣,因为我在FF7上进行了两次测试。我同意
    ==
    应该更快一些,但测试表明不是这样。(可能是Javascript引擎/CPU负载的差异,谁知道呢)@Nightfirecat:这很有趣。你是在比较变量还是文字?我只是在使用它使用的默认测试,即“==/==仅在同一类型上”测试,因为这些是faste测试
    [ { 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 } ]