=== vs ==运营商的表现
几个星期前,我读过这个线程<<比<=快? 关于C
比较运算符。 据说在<
和<=
之间的性能没有区别,因为它们被解释为相同/相似的机器命令。
同时,在我们公司的“最佳实践”中,有人说我们应该总是使用“===”来比较事物而不是“==”。 所以,我开始怀疑这是否合适,因为我习惯于使用“==”和“typeof ... ==”,并且不想改变我的写作方式: - ]
请注意,这是在JavaScript的上下文中。
所以,我有一个小小的研究,在这里比较运算符(== vs ===)应该用在JavaScript比较中吗? 据说:
这是因为相等运算符==确实类型强制...意味着解释器隐式地尝试转换值,然后进行比较。
另一方面,身份运算符===不会执行类型强制,因此它不会在比较时转换值的值
我开始怀疑这是否意味着当我使用“===”运算符时,我将获得良好的性能,因为没有资源用于转换操作数。 在所有代码转换为机器命令之后,这是否意味着当您使用<
和<=
时, C
没有区别,在JavaScript和其他语言中这是相同的?
对于js,===运算符将返回true,如果在字符串类型上使用,并且字符串完全相同的字符。 对于对象,它比较对象引用,而不是内容。
根据ECMA标准:
11.9.6严格平等比较算法比较x === y,其中x和y是值,产生true或false。 这样的比较如下进行:
首先,表现根本不是问题。 对于任何实际的脚本,相比代码中的其他瓶颈(通常DOM操作将成为头号目标),使用一个操作符相对于另一个操作符的任何性能增益都将无限小。
其次,在很多情况下, ==
和===
将执行完全相同的步骤 。 当两个操作数的类型相同(例如,两个字符串或两个数字)时,ECMAScript规范对两个操作符的步骤完全相同。 因此,如果您在一个浏览器或其他环境中观察到两个运算符之间的相同类型操作数的性能差异,则不能保证或者甚至可能在另一个浏览器中看到类似的差异。
在你的问题中提到的typeof
的情况下,两个操作数保证是相同的类型(字符串),并且两个操作符都会完全相同, 所以赞成一个操作符的唯一理由是风格 。
作为一个整体的JS社区在这方面已经变得更加强硬:共识似乎是“从不使用==
和!=
除非你需要类型强制”,这对我的口味来说太过于教条。
我觉得答案很简单,可证实的证据是最好的。
这些操作太小以致于难以对它们进行性能测试。
如果你减去控制测试,看起来在我的浏览器上它们的速度有约30%的差异。 如果你多次这样做,你可以得到不同的答案,但===通常以最快的速度出现,我认为这只是证明差异微乎其微的证明。
我认为这非常证明其他人在说什么,性能差异是浪费时间思考,但它也表明===实际上更快。 希望这个答案可以节省其他人的时间,那些只需要看到证据的人。
var testString = "42";
var testNumber = 42;
var testObject = {};
var start = Date.now();
var result = null;
for(var i = 0; i < 100000000; i++){
result = testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject &&
testString == testString && testNumber == testNumber && testObject == testObject
}
console.log("==", Date.now() - start, result);
var start = Date.now();
var result = null;
for(var i = 0; i < 100000000; i++){
result = testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject &&
testString === testString && testNumber === testNumber && testObject === testObject
}
console.log("===", Date.now() - start, result);
var start = Date.now();
for(var i = 0; i < 100000000; i++){
result = true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true &&
true && true && true
}
console.log("control test", Date.now() - start, result);
链接地址: http://www.djcxy.com/p/31563.html