从上到下按照规则比较,直到能得到确切结果为止
-
两端类型相同,比较值
如果是对象,就是比较对象与对象的地址
-
只要等号两端存在 NaN,返回 false
NaN == [] , NaN == null , NaN == 0 , NaN == NaN ,'a' == NaN都是false
-
两端出现undefined 和 null 只有自身与自身比较,或者这俩互相比较时,才会返回 true,其他时候都是false
null == undefined 这是true,null == [],null == 'null' 这是false
-
两端都是原始类型,转换成数字比较
true == 1,这是true,因为 +true转为数字是1,'a' == 1,这是false,因为 +'a'是NaN,又跳到第二步,所以是false
-
一端是原始类型,一端是对象类型,把对象转换成原始类型后进入第1步
那么对象如何转原始类型?
-
如果对象拥有
[Symbol.toPrimitive]方法,调用该方法。 若该方法能得到原始值,使用该原始值; 若得不到原始值,抛出异常,那就用下一步方法const a = { [Symbol.toPrimitive](){ console.log('toPrimitive') return 1;//得到原始值,如果return this,就得不到原始值,会报错 } }; if (a == 1 && a == 2 && a == 3) { console.log('你好'); } -
调用对象的
valueOf方法,对象都有这个方法,因为原型链上有Object,Object有这个valueOf方法若该方法能得到原始值,使用该原始值; 若得不到原始值,进入下一步
-
调用对象的
toString方法若该方法能得到原始值,使用该原始值; 若得不到原始值,抛出异常
-
// 如何让判断成立输出'你好'
if (a == 1 && a == 2 && a == 3) {
console.log('你好');
}
//答案:
const a = {
count: 1,
valueOf() {
console.log('valueOf');//会打印三次valueOf
return this.count++;
},
};
if (a == 1 && a == 2 && a == 3) {
console.log('你好');
}