如何解决在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?
除了不进行类型转换之外,严格相等运算符 ( ===
) 的行为与抽象相等运算符 ( ==
) 相同,并且类型必须相同才能被视为相等。
该==
运营商将比较平等做任何必要的类型转换之后。该===
运营商将进行转换,因此,如果两个值是不一样的类型===
将简单地返回false
。两者都一样快。
JavaScript 有两组相等运算符:
===
and!==
,以及它们的邪恶双胞胎==
and!=
。好的方法会按照您期望的方式工作。如果两个操作数的类型和值相同,则===
产生true
和!==
产生false
。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但如果它们是不同类型,它们会尝试强制转换值。他们这样做的规则既复杂又难以记住。这些是一些有趣的案例:```js ‘’ == ‘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 ```
缺乏传递性令人担忧。我的建议是永远不要使用邪恶的双胞胎。相反,请始终使用
===
和!==
。刚刚显示的所有比较都false
与===
操作员进行了比较。
更新:
对于对象,==
并===
彼此一致地行动(除非在特殊情况下)。
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
特殊情况是当您将一个基元与一个评估为相同基元的对象进行比较时,由于其toString
或valueOf
方法。例如,考虑将字符串原语与使用String
构造函数创建的字符串对象进行比较。
"abc" == new String("abc") // true
"abc" === new String("abc") // false
此处==
操作符正在检查两个对象的值并返回true
,但===
看到它们的类型不同并返回false
。哪一个是正确的?这实际上取决于您要比较的内容。我的建议是完全绕过这个问题,只是不要使用String
构造函数从字符串文字创建字符串对象。
使用==
运算符 ( Equality )
true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2; //true, because "2" is converted to 2 and then compared
使用===
运算符 ( Identity )
true === 1; //false
"2" === 2; //false
这是因为,这意味着解释器会在比较之前隐式地尝试转换值。
另一方面,,因此在比较时不会转换值,因此跳过一个步骤会更快
解决方法
我正在使用JSLint来检查 JavaScript,并且在执行诸如在语句内部进行比较之类的操作时,它会返回许多建议将==
(两个等号)替换为===
(三个等号)。idSele_UNVEHtype.value.length == 0``if
有没有性能优势,以代替==
用===
?
由于存在许多比较运算符,因此任何性能改进都会受到欢迎。
如果不发生类型转换,性能会不会比==
?