原文鏈接:https://www.jianshu.com/p/b7831b06f61a
上班摸魚的時候,刷到了一篇很有意思的文章,可以先看看上面的鏈接;
對於我這種小白來說,這種判斷條件,似乎,好像,可能,大概不成立吧。然后我仔細看了看(第一種方法),
第一遍,嗯?這是什么操作???
第二遍,哦!原來是這樣(ps:我去翻書了--javaScript高級教程 相等操作符那一節)
ok,弄明白了,就是把a當對象,重寫相等運算符比較之前進行的類型轉換方法---toString
等等,toString ???? 書上明明寫的對象轉換類型,調用的是valueof() 啊;
實踐出真知,當然敲代碼才能弄明白了
1、先敲了一遍網上的代碼↵
window.onload=function(){ var a = { i:1, toString:function(){ console.log('toString') return a.i++ } } if(a==1&&a==2&&a==3){ console.log('true') }else{ console.log(false) } }
控制台輸出
嗯,果然是大佬,代碼完全沒問題呢,成功得到了true;那么,難道是書本錯了,其實是調用toString()的轉換方法?於是,我又敲了一次代碼
2、把toString() 換成valueOf() (๑•̀ㅂ•́)و✧
window.onload=function(){ var a = { i:1, valueOf:function(){ console.log('valueOf') return a.i++ } } if(a==1&&a==2&&a==3){ console.log('true') }else{ console.log(false) } }
控制台輸出
哦吼!!!!也成功了 !!!
等等,我高興個什么勁啊,為什么都成功了啊
於是,我進行了第三步操作
3、同時重寫方法,看調用哪個
window.onload=function(){ var a = { i:1, valueOf:function(){ console.log('valueOf') return a.i++ }, toString:function(){ console.log('toString') return a.i++ } } if(a==1&&a==2&&a==3){ console.log('true') }else{ console.log(false) } }
控制台輸出
emm,很明顯了,都被重寫的情況下,調用了valueOf() ,說明書本沒錯,調用的是對象的valueOf()方法,轉換位數值類型
但是,為什么呢?(°ー°〃)
為什么,只重寫toString()的時候,調用了呢
深思熟慮。。。。。
於是,我又寫了一份代碼,刪除了所有重寫方法
window.onload=function(){ var a = { i:1 } if(a==1&&a==2&&a==3){ console.log('true') }else{ console.log(false) } }
控制台輸出
似乎還是有點迷?
ok,再加一條代碼
window.onload=function(){ var a = { i:1 } console.log(a.valueOf()) console.log(a.toString()) if(a==1&&a==2&&a==3){ console.log('true') }else{ console.log(false) } }
控制台輸出
然后,我在書上翻到了這么一段話
ok,一切都說得通了,因為a本身定義的是對象,所以像調用了valueOf進行數值比較,發現返回的值並不能轉換為數值,所以調用了toString方法,得到了[Object Object],很熟悉吧,對象轉數值的結果,所以對比后得到了false
但是因為我們重寫了valueOf和toString 方法,方法有了數值類型的返回值,所以==得到了正確的比較結果,返回了true;
而且因為valueOf轉換在toString之前,所以比較完成之后就不再調用toString了;
而因為默認valueOf得到的值並不能進行比較,所以調用了重寫后toString方法;
完全ojbk(* ̄▽ ̄*)o
————————————————
版權聲明:本文為CSDN博主「並檐私耳語」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/github_39371177/article/details/95450685