1. 运算规则
两端存在 NaN,返回 false
NaN == NaN; // false
NaN == 1; //false
undefined 和 null 只有与自身比较,或者相互比较时,才返回 true,和其他原始类型比较都返回 false。
undefined == null; // true
undefined == undefined; // true
null == null; // true
两端类型相同,比较值
1 == 2; // false
"yq" == "yqcoder"; // false
两端都是原始类型,转换成数字重新比较
0 == false; // true
"1" == 1; // true
一端是原始类型,一端是对象类型,把对象转换成原始类型后重新比较。
// 当有 [Symbol.toPrimitive] 符号时
let obj = {[Symbol.toPrimitive]() {return 2;},
};
obj == 2; // true// 如果没有 [Symbol.toPrimitive]时, 先调用 valueOf() 拿原始值,如果没有再调用 toString() 拿原始值
let obj = {valueOf() {return {};},toString() {return 4;},
};
obj == 4; // true// 使 obj == 1 && obj == 2 && obj == 3 成立
let obj = {count: 1,valueOf() {return this.count++;},
};
obj == 1 && obj == 2 && obj == 3; // true
2. 对象如何转原始类型
- 如果对象拥有[Symbol.toPrimitive]方法,调用该方法。若该方法能得到原始值,使用该原始值,若得不到原始值,抛出异常
- 调用对象的 valueOf 方法,若该方法能得到原始值,使用该原始值,若得不到原始值,进行下一步
- 调用对象的 toString 方法,若该方法能得到原始值,使用该原始值,若得不到原始值,抛出异常