- 這是今天在一篇文章看到的一道題嘱吗,問題是:
- 能否讓
(a == 1 && a == 2 && a == 3)
這個(gè)表達(dá)式輸出為true
- 答案是:可以
Code:
const a = {
num: 0,
valueOf: function() {
return this.num += 1
}
}
- 通過這段代碼,可以使得上面的表達(dá)式為true
原理:
- 表達(dá)式使用的是
==
整以,而不是===
胧辽,由于==
會有隱性轉(zhuǎn)換的問題,這樣在Javascript中就意味著更多的變化
-
valueOf
這個(gè)方法會在當(dāng)對象需要轉(zhuǎn)換為原始值的時(shí)候自動(dòng)調(diào)用公黑,如:
const a = {
num: 0
}
a.valueOf() //--> {num:0}
//用typrof檢驗(yàn) a.valueOf //--> "Object"
-
既然當(dāng)使用對象需要轉(zhuǎn)換為原始值的時(shí)候自動(dòng)調(diào)用
valueOf
方法邑商,那么通過原型鏈的原理,我們就可以重寫這個(gè)方法凡蚜,使之返回一個(gè)數(shù)字人断、字符串、布爾值朝蜘,如:
a.valueOf = function() {
return this.num
}
- 而在
(a == 1 && a == 2 && a == 3)
這個(gè)表達(dá)式中恶迈,比對是從前往后一步步比對的,那么我們再將每次的返回值+1就可以實(shí)現(xiàn)谱醇,所以繼續(xù)將valueOf
進(jìn)行改造暇仲,如:
a.valueOf = function() {
return this.num += 1
}
結(jié)果:
- 通過上面的原理,通過使用相等于符
==
和重寫valueOf
方法使得(a == 1 && a == 2 && a == 3)
這個(gè)表達(dá)式輸出為true