相等操作符是比较两个值是否相等,在比较前会将两个值转换为相同的类型,‘==’的两边都有可能被转换,最终的比较方式跟全等操作符(===)一致,相等操作符满足交换律
类型 | Undefined | Null | Number | String | boolean | Object |
---|---|---|---|---|---|---|
Undefined | true | true | false | false | false | Isfalsy(B) |
Null | true | true | false | false | false | Isfalsy(B) |
Number | true | true | A===B | A===ToNumber(B) | A===ToNumber(B) | A=== ToPrimitive(B) |
String | true | true | ToNumber(A) === B | A===B | ToNumber(A)===ToNumber(B) | ToPrimitive(B)===A |
Boolean | false | false | ToNumber(A) === B | ToNumber(A)===ToNumber(B) | A===B | ToPrimitive(B)===ToPrimitive(A) |
Object | false | false | ToPrimitive(A) === B | ToPrimitive(A)===B | ToPrimitive(B)===ToPrimitive(A) | A===B |
上面的表格的意思就是两两互相比较:
ToNumber(A)
的意思就是将A转换为数字,这与+A运算符(单目运算符+)的效果相同。
ToPrimitive(A)
通过尝试调用 A 的A.toString()
和 A.valueOf()
方法,将参数 A 转换为原始值(Primitive)。
一般而言,根据 ECMAScript 规范,所有的对象都与 undefined
和 null
不相等。但是大部分浏览器允许非常窄的一类对象(即,所有页面中的 document.all
对象),在某些情况下,充当效仿 undefined
的角色。相等操作符就是在这样的一个背景下。因此,IsFalsy(A)
方法的值为 true ,当且仅当 A 效仿 undefined
。在其他所有情况下,一个对象都不会等于 undefined
或 null
。
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); // true
console.log(num == str); // true
console.log(obj == str); // true
console.log(null == undefined); // true
// 两者都是false 除了极少数的情况
console.log(obj == null);
console.log(obj == undefined);
除了一个类型,每个值也有一个固有的布尔值,通常称为truthy或falsy。
关于falsy
,truthy
可以这样理解:
if (value) {
// value is truthy
}
else {
// value is falsy
// it could be false, 0, '', null, undefined or NaN
}
有些开发者认为,最好永远都不要使用相等操作符。全等操作符的结果更容易预测,并且因为没有隐式转换,全等比较的操作会更快。