我正在使用JSLint来遍历JavaScript,并且在执行诸如在语句内部进行比较之类的操作时,它返回许多建议以(三个等号)替换==(两个等号)。===idSele_UNVEHtype.value.length == 0if
===idSele_UNVEHtype.value.length == 0if
有没有性能优势,以代替==用===?
==
===
由于存在许多比较运算符,因此任何性能改进都将受到欢迎。
如果没有进行类型转换,性能会超过==?
身份(===)运算符的行为与相等(==)运算符相同,但不进行任何类型转换,并且类型必须相同才能被视为相等。
进行任何必要的类型转换后,==运算符将比较是否相等。该运营商将不会进行转换,因此,如果两个值是不一样的类型将简单地返回。两者都同样快。======false
======false
引用Douglas Crockford出色的JavaScript:The Good Parts,
JavaScript有两组相等的运算符:===和!==,以及它们的邪恶孪生子==和!=。优秀的产品以你期望的方式工作。如果两个操作数具有相同的类型并具有相同的值,则===产生true和!==产生false。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但是如果操作数是不同类型,则它们会试图强制值。他们所遵循的规则是复杂而难忘的。这些是一些有趣的情况:
JavaScript
!==
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
传递性的缺乏令人震惊。我的建议是不要使用邪恶的双胞胎。相反,请始终使用===和!==。刚才显示的所有比较都是false由===操作员进行的。
更新: @Casebash在评论中和@Phillipe Laybaert 关于引用类型的答案中提出了一个很好的观点。对于引用类型==,===彼此之间要保持一致(特殊情况除外)。
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构造函数创建的字符串对象进行比较。
toString
valueOf
tring
"abc" == new String("abc") // true "abc" === new String("abc") // false
在这里,==操作员正在检查两个对象的值并返回true,但是===看到它们不是同一类型并返回false。哪一个是正确的?这确实取决于你要比较的内容。我的建议是完全绕过该问题,只是不要使用String构造函数来创建字符串对象。
使用==运算符(等于)
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
这是因为相等运算符==确实键入了coercion,这意味着解释器在比较之前隐式尝试转换值。
另一方面,身份运算符===不会执行强制类型转换,因此在比较时不会转换值,因此跳过一个步骤会更快