在JavaScript中,使用双等号(==
)与使用三等号(===
)之间是否存在性能差异?
示例:if (foo == bar)
vs if (foo === bar)
答案 0 :(得分:40)
如果比较的类型相同, 它们是相同的 。也就是说他们使用 完全相同的算法 。
如果类型不同,则性能无关紧要。要么你需要类型强制,要么你不需要。如果您不需要,请不要使用==
,因为您获得的结果可能是意外的。
答案 1 :(得分:26)
严格比较(===
)总是稍快一点,但the difference is usually negligible。
如果您确定在比较中不需要类型强制,那么首选===
是绝对有意义的。它始终至少与==
一样快。
答案 2 :(得分:14)
编辑以供参考,这是Axel Rauschmayer博士的 by spec 解释 http://www.2ality.com/2011/06/javascript-equality.html 非常好写。
===
(严格平等):仅考虑具有相同类型的相等值。
==
(宽恕平等)
在所有现代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”比“ ==”更快。但是,如果两个项目严格相等,则“ ===”应该比“ ==”花费更多的时间,因为它必须检查更多属性是否相等。