前奏 看看 ==
N表示ToNumber操作,即將操作數轉爲數字。
P表示ToPrimitive操作,即將操作數轉爲原始類型的值(Undefined、Null、Boolean、Number和String等五種)
-
undefined == null,結果是true。且它倆與所有其他值比較的結果都是false。
-
String == Boolean,需要兩個操作數同時轉爲Number。
-
String/Boolean == Number,需要String/Boolean轉爲Number。
-
Object == Primitive,需要Object轉爲Primitive(具體通過valueOf和toString方法)。
重點 看看 valueof() 和 toString()
所有JS數據類型都擁有valueOf和toString這兩個方法,null和 undefined 除外。它們繼承自Object(即 Object.prototype.valueOf()和 Object.prototype.toString()),當然也可能被子類重寫。
是否重寫 toString() 和 valueOf() 和 其返回值是否爲原始數據類型,影響比較結果
1. 都重寫時: 有操作符 且 valueOf()返回值是非原始類型 且 console.log( a == b) ,b爲非原始類型時,兩個方法都不調其實。
2.都重寫時: 有操作符 且 valueOf()返回值是原始類型 :valueOf()優先級高於toString()
3. 都重寫時: 有操作符 且 valueOf()返回值是非原始類型 :兩個方法都調(先調用 valueOf() 再 toString() ) 給人一種假象 toString()優先級高於valueOf()
4. 只重寫了 toString() : toString()優先級高於valueOf()
5.只重寫了valueOf() : valueOf()優先級高於toString()
6.都不重寫 :默認調用的valueof() :可以通過== 和 === 比較看。
7. console 中打印展示 有可能 不調用 valueOf 而並非 [1,2] 和 [1,2] 爲兩塊地址而顯示false 的理解。
拓展:toString()可以判斷數據類型
遺留的問題:圖上的報錯說對象不能轉化成基本類型 爲什麼?希望大家能幫我解答哈