如何讓(a==1&&a==2&&a==3)成立


原文鏈接: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM