Eri*_*ric 40 javascript browser comparison performance node.js
在JavaScript中,使用double equals(==)与使用triple equals(===)之间是否存在性能差异?
示例:if (foo == bar)vsif (foo === bar)
小智 41
如果比较的类型相同,则它们是相同的.也就是说他们使用完全相同的算法.
如果类型不同,那么性能就无关紧要了.要么你需要类型强制,要么你不需要.如果您不需要它,请不要使用,==因为您获得的结果可能是意外的.
Dav*_*ard 29
严格比较(===)总是稍微快一点,但差异通常可以忽略不计.
===如果您确切地知道在比较中不需要类型强制,那么首选它是绝对有意义的.它总是至少和它一样快==.
小智 14
编辑:供参考,这是由 Axel Rauschmayer博士的规范解释 http://www.2ality.com/2011/06/javascript-equality.html 非常好的写作.
=== (严格平等):仅考虑具有相同类型的相等值.
== (宽容平等)
在所有现代Javascript环境中,它们的实现完全不同.简单来说,==通过将给定变量转换为基元(字符串,数字,布尔值)来测试相似性.===测试严格相同,这意味着没有转换完全相同的对象或原始值.
如果你做
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);
Run Code Online (Sandbox Code Playgroud)
输出:
[ { 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 } ]
Run Code Online (Sandbox Code Playgroud)
==和之间的区别的本质===是通过===不显示在该列表中来说明.它完全跳过JavascriptLand的旅程.比较性能时,这种冒险是昂贵的.
但是,您需要考虑引擎优化.对于大多数对象,引擎将能够删除大部分步骤并保留在NativeLand中并获得几乎相同的性能.但这不是一种保证,如果有什么东西阻止引擎能够使用优化,代码中的一些花哨或覆盖内置或无数问题,那么你会立即看到性能结果.===迫使它.
=== 是Javascript中唯一不可变的东西.
| 归档时间: |
|
| 查看次数: |
13775 次 |
| 最近记录: |