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 方法,若該方法能得到原始值,使用該原始值,若得不到原始值,拋出異常