JavaScript双等号(==)和三重等号(===)的性能差异
JavaScript performance difference between double equals (==) and triple equals (===)
在JavaScript中,使用双等号(==
)与使用三重等号(===
)之间是否存在性能差异?
示例:if (foo == bar)
vs if (foo === bar)
-
如果比较的类型相同,它们是相同的。也就是说它们使用完全相同的算法
-
如果类型不同,则性能无关。要么需要类型强制转换,要么不需要。如果你不需要它,不要使用
==
,因为你得到的结果可能是意想不到的。
严格比较(===
)总是会稍微快一点,但差异通常可以忽略不计。
如果您确定在比较中不需要类型强制转换,那么首选===
绝对是有意义的。它总是至少和==
一样快。
编辑:供参考,这里是Axel Rauschmayer博士在spec解释的http://www.2ality.com/2011/06/javascript-equality.html写得真好。
===
(严格相等):只考虑具有相同类型的相等值。
- 未定义===未定义,null === null,
- NaN ===不包含自身,
- 原语[Number|String|Boolean] ===原语值= equal,
- to self (+0 === -0)
- 两个对象[Array|Object|Function] ===只有自己(完全相同的实体)
==
(宽大相等)
- 如果两个值具有相同的类型:比较===.
- 未定义== null
- number and string: string => number and compare
- 布尔值和非布尔值=>非布尔值进行编号和比较 字符串或数字=>对象:将对象转换为原语并进行比较。
在所有现代Javascript环境中,它们的实现完全不同。简单来说,==
通过将给定变量转换为原语(字符串、数字、布尔值)来测试相似性。===
测试严格相同,这意味着完全相同的对象或原始值没有转换。
如果你这样做objOne == objTwo
实际发生的是[[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())
valueOf的分辨率可能有些涉及,在JS中暴露的函数和内部引擎之间跳跃。可以这么说,比较总是以两个值被强制转换为基元值结束,否则将抛出错误。
编辑: EQUALS
实际上首先尝试STRICT_EQUALS
,这抢占了进程的其余部分。
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中唯一不可变的东西
由于性能,我认为===
有更好的性能,因为===
比==
更严格,
。在Chrome控制台中尝试以下操作:
> 1 == '1'
true
> 1 === '1'
false
==
必须检查比===
更多的东西
从一些脆弱的测试来看,==
似乎比===
略快。
这里的边际是指我可以在数百万个测试的交互中看到几毫秒的差异。如果不使用最适合手头任务的方法,就不可能需要性能增益。
编辑:实际上,似乎取决于/什么/你比较和浏览器的实现。换句话说,不用担心。
这取决于所比较的项目。由于"==="比"=="更严格,因此它应该比"=="更快地返回false。但是,如果两项严格相等,"==="应该比"=="花更多的时间,因为它必须检查更多的属性是否相等。
- Javascript平等三重等于,但是大于和小于呢?
- 打字.当使用“三重斜线”时,是否仍然需要三重斜线参考;从“进口”;
- 使用三.js提高性能
- 三个js性能如何使使用图像纹理更快
- 三个js 25000 BoxGeometry 200模型如何提高性能
- 在javascript音频中看到双重,三重声音,如何解决它
- 两个不可变的列表 - 如何使三重平等工作
- 带有杜威十进分类法的三重下拉菜单
- 三重条件做while循环
- JavaScript中的三重DES加密和PHP中的解密
- 如何修复三重下拉菜单
- 我可以使用三重等于进行JavaScript字符串比较吗
- JavaScript双等号(==)和三重等号(===)的性能差异
- 在Javascript中循环遍历三重嵌套对象
- AJAX - jQuery -三重动态下拉菜单
- Highcharts三重下钻圆角插件Bug
- 使用“CryptoJS"在Titanium移动项目的库中解密文本消息[三重DES]
- JavaScript三重等号和三变量比较
- 清理文本字符串中字母之间的空格/三重空格
- 我怎么用D3做一个三重柱状图呢?