這道題,是不是很多小夥伴一眼看上去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)
複製程式碼