看到了一道面試題:a==1&&a==2&&a==3在什麼時候成立,查閱資料後總算明白了,記錄一下。
一.利用==中的隱式類型轉換
1.原理與思路
首先要了解==運算符中究竟發生了什麼。
js調用==進行比較時,不同與===,雙等號會觸發類型轉換,進行比較的事實上不是原始值,而是valueOf()的返回值,類型轉換可能會觸發兩個函數,分別是toString()與valueOf(),關於區別可參照https://www.jb51.net/article/102027.htm
在這裏調試後發現觸發了valueOf(),每進行一次比較就調用一次,我們可以做一些簡單代碼來測試是否正確。
//定義obj2,重寫方法
let obj2={
arr:[1,2,3],
toString:()=>{
console.log("toString")
},
valueOf:()=>{
console.log("valueOf")
}
}
接着在控制檯輸入==來進行比較操作,查看結果。
的確是調用了valueOf(),所以我們可以在這裏做一些手腳。
2.JS實現
//定義obj3來完成操作
let obj3={
i:1,
valueOf:()=>{
return obj3.i++
}
}
二.利用definProperty的get方法
1.原理與思路
js調用對象屬性時時經過了get與set一層的,我們可以在這裏進行改動。
2.js實現
let a={
temp:'',
time:0
}
Object.defineProperty(a,"temp",{
get:function(){
return a.time++;
}
})