在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?
我正在使用JSLint来浏览JavaScript,它返回了许多建议,以便在执行诸如在语句内部进行比较之类的事情时将(两个等号)替换为(三个等号)。==
===
idSele_UNVEHtype.value.length == 0
if
替换为 是否有性能优势?==
===
任何性能改进都将受到欢迎,因为存在许多比较运算符。
如果没有发生类型转换,是否会有性能提升?==
我正在使用JSLint来浏览JavaScript,它返回了许多建议,以便在执行诸如在语句内部进行比较之类的事情时将(两个等号)替换为(三个等号)。==
===
idSele_UNVEHtype.value.length == 0
if
替换为 是否有性能优势?==
===
任何性能改进都将受到欢迎,因为存在许多比较运算符。
如果没有发生类型转换,是否会有性能提升?==
严格相等运算符 () 的行为与抽象相等运算符 () 相同,只是不执行类型转换,并且类型必须相同才能被视为相等。===
==
运算符将在执行任何必要的类型转换后比较相等性。运算符不会进行转换,因此如果两个值不相同,则类型将简单地返回 。两者都同样快。==
===
===
false
引用 Douglas Crockford 出色的 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
缺乏传递性令人震惊。我的建议是永远不要使用邪恶的双胞胎。相反,请始终使用 和 。刚才显示的所有比较都与操作员一起产生。
===
!==
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
特殊情况是,当您将基元与由于其 or 方法而计算结果为相同基元的对象进行比较时。例如,考虑将字符串基元与使用构造函数创建的字符串对象进行比较。toString
valueOf
String
"abc" == new String("abc") // true
"abc" === new String("abc") // false
在这里,运算符正在检查两个对象的值并返回 ,但是看到它们不是同一类型并返回 。哪一个是正确的?这实际上取决于你试图比较什么。我的建议是完全绕过这个问题,只是不要使用构造函数从字符串文本创建字符串对象。==
true
===
false
String
参考
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
使用运算符(相等==
)
true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2; //true, because "2" is converted to 2 and then compared
使用运算符(标识===
)
true === 1; //false
"2" === 2; //false
这是因为相等运算符 ==
确实键入强制,这意味着解释器在比较之前隐式尝试转换值。
另一方面,标识运算符 ===
不执行类型强制,因此在比较时不会转换值。