JavaScript的 - === VS ==操作符的性能(JavaScript - === vs

2019-06-28 05:42发布

几个星期前,我看过这个线程比<= <更快? 约比较运算符在C 。 据说,存在之间的性能没有差异<<=因为它们将被解释为相同/类似的机器命令。

与此同时,在我们公司的“最佳实践”,有人说,我们应始终使用“===”比较的东西,而不是“==”。 于是,我开始怀疑,因为我习惯使用“==”和“的typeof ... ==”,不想改变我的写作方式这始终是合适的: - ]

请注意,这是在JavaScript的环境。

所以,我有一个小小的研究,在这里它等于运算符(== VS ===)应该在JavaScript中的比较中使用? 据说:

这是因为平等的==操作符不会强制类型转换...意思解释隐含试图将这些值转换,然后做比较。

在另一方面,身份操作===没有做强制类型转换,所以这样的比较时,它不会转换值的值

我开始怀疑,如果这意味着,当我使用了“===”操作符,我会得到良好的性能,因为没有资源将在转换操作数中度过。 而所有的代码变成机器命令后,这是否意味着就像存在没有区别C当你使用<<=这是在JavaScript和其他语言一样吗?

Answer 1:

对于JS,如果字符串类型使用===运算符将返回true,而弦乐是完全一样的人物。 对于对象是比较对象引用,而不是内容。

从ECMA标准 :

11.9.6全等比较算法的比较X === y,其中x和y是数值,产生真或假。 如下执行这样的比较:

  1. 如果Type(x)是从类型(Y)不同,返回false。
  2. 如果Type(x)为未定义,返回true。
  3. 如果Type(x)为空,返回true。
  4. 如果Type(x)是数字,然后一个。 如果x是NaN,返回false。 湾 如果y是NaN,返回false。 C。 如果x是相同数量的价值为y,返回true。 d。 如果x为+0,y为-0,返回true。 即 如果x为-0,y为+ 0,返回true。 F。 返回FALSE。
  5. 如果Type(x)是字符串,那么,如果x和y是完全相同的字符(相同的长度和在对应的位置相同的字符)的相同序列返回true; 否则,返回false。
  6. 如果Type(x)是布尔值,如果x和y均为真或假都返回true;


Answer 2:

首先,性能根本就不是一个问题。 对于任何真正的脚本,使用一个运营商比其他相比,在代码等瓶颈将是infinitessimally小的任何性能增益(通常DOM操作将是头号目标)。

其次,在许多情况下, =====准确执行相同的步骤 。 当类型的两个操作数的是相同的(两个字符串或两个数,例如),ECMAScript规范具有正是这两个运营商相同的步骤。 因此,如果你观察到的在一个浏览器或其他环境中相同类型的操作数的两个运营商之间的性能差异,也不能保证,甚至可能你会看到在其他浏览器类似的差异。

在的情况下typeof ,因为在你的问题中提到,两个操作数都保证是同一类型(字符串)和两个运营商将做完全一样的东西, 所以唯一的理由,以支持其运营商比其他的文体

该JS社会作为一个整体已经对此颇为强硬:“从来不用的共识似乎是==!= ,除非你需要强制类型转换”,这是我的口味太教条。



Answer 3:

我感到很容易核查的证据将是最好的答案。

这些操作是如此之小,这是很难的性能测试。

  • == 1648真
  • === 1629真
  • 控制测试1575真

如果你减去关闭控制测试,它看起来像有他们的速度在我的浏览器中的约30%的差异。 如果你这样做多次,就可以得到不同的答案,但通常===出现的最快的,我认为这只是一个证明是多么微不足道的差别。

我想,这几乎证明别人在说,该性能差异的时间去思考一种浪费, 但同时也表明,实际上===更快 。 希望这个答案可以节省其他人的时候,那些谁只是必须看到证据。

2019和更新

2019年4月9日的Firefox具有改进的测试:

  • == 1383真
  • === 1167真
  • 控制测试429真

2019年4月9日铬具有改进的测试:

  • == 249真
  • === 248真
  • 控制测试248真

2019年4月9日边缘与改进的测试:

  • == 22510真
  • === 20315真
  • 控制测试4968真

浏览器在过去几年变得更聪明,看来我原来的测试已经跑了针对Chrome和Firefox凉爽的优化,使其不再有用。 我做了测试更加难以优化,提高运行的数目再得到有意义的结果。 它看起来像===仍全线更快 。 它可能仍然是时间去担心浪费。

 var testString = "42"; var testString2 = "43"; var testString3 = "42"; var testNumber = 42; var testNumber2 = 43; var testNumber3 = 42; var testObject = {}; var testObject2 = {}; var testObject3 = testObject; var start = Date.now(); var result = null; for(var i = 0; i < 200000000; i++){ result = testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && testString == testString3 && testNumber == testNumber3 && testObject == testObject3 } console.log("==", Date.now() - start, result); var start = Date.now(); var result = null; for(var i = 0; i < 200000000; i++){ result = testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && testString === testString3 && testNumber === testNumber3 && testObject === testObject3 } console.log("===", Date.now() - start, result); var start = Date.now(); var alwaysTrue = true; var alwaysFalse = false; for(var i = 0; i < 200000000; i++){ result = alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysFalse || alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue && alwaysTrue } console.log("control test", Date.now() - start, result); 



Answer 4:

你会得到什么表现不要紧, ===显然在这种情况下,更好的选择。 别的比如更好的性能只是锦上添花。 此外,不同的两种方式是最小的。



Answer 5:

这是一个脚本语言。 这些运营商的表现不应该的问题这么多,你应该担心,因为有一堆消耗更多的能量,就像它在虚拟机上运行的事实,其他的事情,是弱类型化,用HTML工作DOM在浏览器中......

此外,无论是运营商做完全不同的事情,所以一个可能不互换与其他任何情况。

也就是说,我认为(但没有测试),其===更快。 是的原因,它只需比较类型,如果匹配,比较原始数据。 在==操作符将尝试一种类型转换为另一种,如果他们不匹配。 这将是在大多数情况下,更昂贵的操作。

这是幸运的,因为在大多数情况下===是更好的选择。 :)

但无论如何,你可以很容易地测试它(确保你测试多种情况下,都与同一类型和几个不同类型的),但是如果你不知道如何测试它,我会完全停止担心。 所不同的,如果有的话,是不会杀了你。



Answer 6:

性能差异可以忽略不计,这意味着你不应该浪费您宝贵的脑循环想着它。 如果你真的想知道,虽然,你应该测试。

使用===除非你有一个很好的理由不(你可能没有)。



文章来源: JavaScript - === vs == operators performance