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

我正在使用JSLint来浏览JavaScript,它返回了许多建议,以便在执行诸如在语句内部进行比较之类的事情时将(两个等号)替换为(三个等号)。=====idSele_UNVEHtype.value.length == 0if

替换为 是否有性能优势?=====

任何性能改进都将受到欢迎,因为存在许多比较运算符。

如果没有发生类型转换,是否会有性能提升?==


答案 1

严格相等运算符 () 的行为与抽象相等运算符 () 相同,只是不执行类型转换,并且类型必须相同才能被视为相等。=====

参考:Javascript 教程:比较运算符

运算符将在执行任何必要的类型转换后比较相等性。运算符不会进行转换,因此如果两个值不相同,则类型将简单地返回 。两者都同样快。========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

Equality Comparison Table

缺乏传递性令人震惊。我的建议是永远不要使用邪恶的双胞胎。相反,请始终使用 和 。刚才显示的所有比较都与操作员一起产生。===!==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 方法而计算结果为相同基元的对象进行比较时。例如,考虑将字符串基元与使用构造函数创建的字符串对象进行比较。toStringvalueOfString

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

在这里,运算符正在检查两个对象的值并返回 ,但是看到它们不是同一类型并返回 。哪一个是正确的?这实际上取决于你试图比较什么。我的建议是完全绕过这个问题,只是不要使用构造函数从字符串文本创建字符串对象。==true===falseString

参考
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3


答案 2

使用运算符(相等==)

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

这是因为相等运算符 == 确实键入强制,这意味着解释器在比较之前隐式尝试转换值。

另一方面,标识运算符 === 不执行类型强制,因此在比较时不会转换值。