2020-05-09

? ? ? ? ? ? ? ? ? ? ? ? ? ? 如何讓 (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

部署[Symbol.toPrimitive]接口
利用數(shù)據(jù)劫持(Proxy/Object.defineProperty)??
數(shù)組的?toString?接口默認(rèn)調(diào)用數(shù)組的?join?方法,重寫?join?方法

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容