JavaScript - === 与 == 运算符的性能

标签 javascript performance equality comparison-operators equality-operator

几周前,我读过这个帖子 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/

相关文章:

javascript - Kendo UI折线图中的点拖动

performance - GHC 中的跨模块优化

scala - Spark 中的性能调整

javascript - 为什么 `void 0` 可能是 “faster” 而不是 `undefined` ?

go - 如果结构包含 json.RawMessage,则检查结构是否为空

c++ - 检查两个二维数组是否相等

c# - 如何在 C# 中检查自定义类数组的相等性?

javascript - Google 自定义搜索结果在页面弹出窗口中打开

javascript - 当浏览器未实现 HTMLUnknownElement 时,如何检查元素是否为未知类型

javascript - Angular JS 注入(inject)路由问题