這是在國外的一道面試題看到的,你們先本身想一下,在什麼狀況下這個判斷會成立?
按正常思惟想,這個是不可能成立的,但nothing is impossible
,首先貼上正確答案代碼面試
const a = { i: 1, toString: function () { return a.i++; } } console.log(a == 1 && a == 2 && a == 3)
這裏作判斷時,首先會調用valueOf函數,數組調用valueOf後返回的仍是數組自己,就會再次調用toString函數,這裏是重寫了toString方法,而且return的是a.i++,因此每調用一次,都會在上次的值得基礎上自加一次,
因此結果爲true。
那麼觸類旁通,這道題再變一下,「a===1 && a===2 && a===3 爲true」改爲這樣,還能不能成立呢?
最後結果:
這是由於「===」表明全等(嚴格運算符),即值和類型都相等,其原理爲「===」不會進行隱式轉換,因此也就不會調用valueOf等方法了,而「==」爲值相等(相等運算符),因此在比較不一樣類型的數據時,相等運算符會先將數據進行類型轉換,而後再用嚴格相等運算符比較。
因此能用「===」的地方儘可能用「===」,相等運算符隱藏的類型轉換,會帶來一些違反直覺的結果。數組