JavaScript提供三种不同的值比较操作:
- 抽象相等比较,使用 == ,两边值类型不同的时候,先进行类型转换,再比较
- 严格相等比较,使用 ===,不做类型转换,类型不同就是不等
- Object.is (ES6 新特性)与===的行为基本一致
非严格相等
相等操作符比较两个值是否相等,在比较前将两个被比较的值转换为相同类型。在转换后(等式的一边或两边都可能被转换),最终的比较方式等同于全等操作符 === 的比较方式。
被比较值转换规律:
严格相等
全等操作符比较两个值是否相等,两个被比较的值在比较前都不进行隐式转换。
var num = 0;
var obj = new String("0");
var str = "0";
var b = false;
console.log(num === num); // true
console.log(obj === obj); // true
console.log(str === str); // true
console.log(num === obj); // false
console.log(num === str); // false
console.log(obj === str); // false
console.log(null === undefined); // false
console.log(obj === null); // false
console.log(obj === undefined); // false
Object.is
其行为与===
基本一致,不过有两处不同:
- +0不等于-0。
- NaN等于自身。
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
大部分情况下,用严格相等(===)比较就可以
判断NaN 还可以用 isNaN
const a = NaN;
console.log(a === a); // false
console.log(isNaN(a)); // true
判等对比
x | y | == | === | Object.is |
---|---|---|---|---|
undefined | undefined | true | true | true |
null | null | true | true | true |
true | true | true | true | true |
false | false | true | true | true |
“foo” | “foo” | true | true | true |
0 | 0 | true | true | true |
+0 | -0 | true | true | false |
0 | false | true | false | false |
“” | false | true | false | false |
“” | 0 | true | false | false |
“0” | 0 | true | false | false |
“1” | 1 | true | false | false |
[1,2] | “1,2” | true | false | false |
new String(“foo”) | “foo” | true | false | false |
null | undefined | true | false | false |
null | false | false | false | false |
undefined | false | false | false | false |
{ foo: “1” } | { foo: “1” } | false | false | false |
new String(“foo”) | new String(“foo”) | false | false | false |
0 | null | false | false | false |
0 | NaN | false | false | false |
“foo” | NaN | false | false | false |
NaN | NaN | false | false | true |
参考链接
JavaScript 中的相等性判断