几周前,我读过这个帖子 Is < faster than <=?关于 C
中的比较运算符。据说<
之间的性能没有区别。和<=
因为它们被解释为相同/相似的机器命令。
同时,在我们公司的“最佳实践”中,据说我们应该始终使用“====”来比较事物,而不是“==”。所以,我开始想知道这是否总是合适的,因为我习惯使用“==”和“typeof ... ==”并且不想改变我的写作方式:-]
请注意,这是在 JavaScript 上下文中。
所以,我做了一些研究,这里 Which equals operator (== vs ===) should be used in JavaScript comparisons?据说:
This is because the equality operator == does type coercion...meaning that the interpreter implicitly tries to convert the values and then does the comparing.
On the other hand, the identity operator === does not do type coercion, and so thus it does not convert the values of the values when comparing
我开始想知道这是否意味着当我使用“===”运算符时,我会获得良好的性能,因为不会花费任何资源来转换操作数。而所有代码都转为机器命令之后,是不是就意味着就像C
没有区别一样?当您使用<
时和<=
,这在 JavaScript 和其他语言中是一样的吗?
最佳答案
我认为有易于验证的证据的答案是最好的。
这些操作非常小,很难对其进行性能测试。
- == 1648 正确
- === 1629 正确
- 对照测试 1575 true
如果减去控制测试,它们在我的浏览器上的速度似乎有约 30% 的差异。如果多次执行此操作,您可能会得到不同的答案,但 === 通常出现得最快,我认为这证明了差异是多么微不足道。
我认为这很大程度上证明了其他人所说的,即性能差异是浪费时间去思考,但它也表明 === 实际上更快。希望这个答案可以节省其他人的时间,那些只需要看到证据的人。
2019 年更新
2019-04-09 改进测试的 Firefox:
- == 1383 正确
- === 1167 正确
- 对照测试 429 true
2019-04-09 Chrome 改进了测试:
- == 249 正确
- === 248 正确
- 对照测试 248 true
2019-04-09 Edge 改进了测试:
- == 22510 正确
- === 20315 正确
- 对照测试 4968 true
多年来,浏览器变得更加智能,看来我最初的测试遇到了 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);
关于JavaScript - === 与 == 运算符的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12374815/