js中 a==1&&a==2&&a==3 這個條件什麼時候能成立

zhangfaliang發表於2019-03-21

這道題,是不是很多小夥伴一眼看上去a是true的時候就可以解決到實現a==1&&a==2&&a==3,但是答案去不是a=true,不信的小夥伴可以去控制檯試試。

試過的小夥伴是不是發現a=true,沒有成立呢,剛開始的時候我也和大家認為是一樣的,但是試過以後並不是。
其實這道題題可以利用不同型別的比較的隱形轉化來處理,大家知道物件和數子的比較會發生些什麼過程嗎,大家是不是都想到了,就是js會把物件中的值轉換成數字進行比較,哪有是怎麼轉換的呢
如果一個運算元是物件,另一個運算元不是進行相比較的話,則呼叫物件的valueOf()方法,看看是否有valueOf(),有的話用得到的基本型別值按照前面的規則進行比較;如果沒有則會再次呼叫toString()用得到的基本型別值按照前面的規則進行比較。
我們們是不是可以利用這隱身規則進行處理a==1&&a==2&&a==3成立,看下面的程式碼

var a={
    i:1,
    valueOf:()=>{
        return a.i++
    }
}
console.log(a==1&&a==2&&a==3)
複製程式碼

這塊還利用了後置++運算子,先++後賦值的原理當然前置運算++也是可以的,看下面程式碼

var a={
    i:0,
    valueOf:()=>{
        return ++a.i
    }
}
console.log(a==1&&a==2&&a==3)
複製程式碼

同理也可以利用toString()方法處理,看下面程式碼

var a={
    i:1,
     valueOf:null,
    toString:()=>{
         return a.i++
    }
}
console.log(a==1&&a==2&&a==3)
var a={
    i:0,
    valueOf:null,
    toString:()=>{
         return ++a.i 
    }
}
console.log(a==1&&a==2&&a==3)
複製程式碼

如果大家瞭解defineProperty這個方法的話,也會想到這樣的方法,看程式碼

var val=0
Object.defineProperty(window,'a',{

get:()=>{return ++val}
})
console.log(a==1&&a==2&&a==3)

複製程式碼

同樣陣列也是繼承了object的valueOf、toString,看程式碼

var a=[1,2,3]
a.valueOf=a.shift
console.log(a==1&&a==2&&a==3)
var a=[1,2,3]
a.toString=a.shift
console.log(a==1&&a==2&&a==3)

複製程式碼

但是陣列也會調取join去和其他型別比較,看程式碼

var a=[1,2,3]
a.join=a.shift
console.log(a==1&&a==2&&a==3)
複製程式碼

相關文章