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 方法,若该方法能得到原始值,使用该原始值,若得不到原始值,抛出异常