在JavaScript比较中,应该使用哪个等号运算符(== vs ===)?

发布时间 2023-10-09 21:14:28作者: 小满独家

内容来自 DOC[ https://q.houxu6.top/?s=在JavaScript比较中,应该使用哪个等号运算符(== vs =)?](https://q.houxu6.top/?s=在JavaScript比较中,应该使用哪个等号运算符( vs ===)?)

我正在使用JSLint来检查JavaScript代码,并且它返回了许多建议,建议在if语句中比较idSele_UNVEHtype.value.length == 0时,将==(两个等号)替换为===(三个等号)。

==替换为===会有什么性能优势吗?

如果没有任何类型转换发生,那么与==相比是否会有性能提升?


严格相等运算符(===)的行为与抽象相等运算符(==)完全相同,除了不进行任何类型转换外,并且类型必须相同才能被认为是相等的。

参考资料:JavaScript教程:比较运算符

==运算符会在进行任何必要的类型转换后进行相等性比较。===运算符不会进行转换,因此如果两个值的类型不同,===将简单地返回false。两者的速度都很快。

引用道格拉斯·克罗克福德(Douglas Crockford)出色的《JavaScript:好东西》(JavaScript: The Good Parts),

JavaScript有两种相等运算符集:===!==,以及它们的邪恶双胞胎==!=。好的运算符按照你预期的方式工作。如果两个操作数具有相同的类型和相同的值,则===产生true!==产生false。邪恶的双胞胎在操作数具有相同的类型时起作用,但如果它们具有不同的类型,它们会尝试强制转换值。它们执行此操作的规则是复杂且难以记忆的。以下是一些有趣的情况:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

对于对象,=====在彼此之间保持一致(除了特殊情况)。

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

特殊情况是当您比较一个原始值和一个通过其toStringvalueOf方法计算为相同原始值的对象时。例如,考虑使用String构造函数从字符串字面量创建字符串对象的字符串原始值的比较。

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

在这里,==运算符正在检查两个对象的值并返回true,但===看到它们不是同一类型并返回false。哪一个是正确的?那真的取决于你想要比较什么。我的建议是不要使用String构造函数从字符串字面量创建字符串对象。

参考资料:https://262.ecma-international.org/5.1/#sec-11.9.3