? ? ? ? ? ? ? ? ? ? ? ? ? ? 如何讓 (a == 1 && a == 2 && a == 3) 的值為true?
==操作符在左右數(shù)據(jù)類型不一致時(shí),會(huì)先進(jìn)行隱式轉(zhuǎn)換。
a == 1 && a == 2 && a == 3的值意味著其不可能是基本數(shù)據(jù)類型。因?yàn)槿绻?a 是 null 或者是 undefined bool類型,都不可能返回true。
因此可以推測 a 是復(fù)雜數(shù)據(jù)類型,JS 中復(fù)雜數(shù)據(jù)類型只有object,回憶一下,Object 轉(zhuǎn)換為原始類型會(huì)調(diào)用什么方法?
如果部署了[Symbol.toPrimitive]接口,那么調(diào)用此接口,若返回的不是基本數(shù)據(jù)類型,拋出錯(cuò)誤。
如果沒有部署[Symbol.toPrimitive]接口,那么根據(jù)要轉(zhuǎn)換的類型,先調(diào)用valueOf/toString
非Date類型對象,hint是default時(shí),調(diào)用順序?yàn)椋簐alueOf>>>toString,即valueOf返回的不是基本數(shù)據(jù)類型,才會(huì)繼續(xù)調(diào)用valueOf,如果toString返回的還不是基本數(shù)據(jù)類型,那么拋出錯(cuò)誤。
如果hint是string(Date對象的hint默認(rèn)是string) ,調(diào)用順序?yàn)椋簍oString>>>valueOf,即toString返回的不是基本數(shù)據(jù)類型,才會(huì)繼續(xù)調(diào)用valueOf,如果valueOf返回的還不是基本數(shù)據(jù)類型,那么拋出錯(cuò)誤。
如果hint是number,調(diào)用順序?yàn)椋簐alueOf>>>toString



let a = { i: 1, toString () { return a.i++ } }? //利用toString
let a = { i: 1, valueOf () { return a.i++ } }? //利用valueOf