在JS中讲竿,如何讓(a===1 && a===2 && a === 3)(嚴格相等)的值為true?

??之前在社區(qū)看到這道題時弄屡,我第一反應就是如果我在代碼庫中看到這樣的代碼我肯定是很絕望的L赓鳌!膀捷!言歸正傳迈嘹,看到這題的時候,我首先想到的是(a == 1 && a == 2 && a==3)為true的情況(寬松匹配),我們先了解這種情況,然后在解決擴展問題秀仲。
??首先融痛,在JS中,寬松匹配 ==會先將左右兩兩邊的值轉(zhuǎn)化成相同的原始類型神僵,然后再去比較他們是否相等雁刷。在轉(zhuǎn)化之后(== 一邊或兩邊都需要轉(zhuǎn)化),最后的相等匹配會像 ===符號一樣去執(zhí)行判斷保礼。
??那么沛励,我們考慮到的應該是a應該是什么類型,在a==**的時候發(fā)生了什么炮障?再去考慮a應該等于什么目派。

  1. 如果a是一個對象Object,那在執(zhí)行a==的時候首先會去先執(zhí)行valueOf方法胁赢,如果沒有valueOf方法企蹭,就會去執(zhí)行toString方法。(toString方法與valueOf類似智末,這里不再重復)
const a = { value: 0 }
a.valueOf = function () {
    return  this.value += 1
}
console.log( a == 1 && a == 2 && a == 3 );
  1. 如果a是一個數(shù)組Array谅摄,在數(shù)組轉(zhuǎn)換成字符串的時候,數(shù)組toString會隱含調(diào)用join()方法
const a = [1, 2, 3];
a.join = a.shift;
console.log( a == 1 && a == 2 && a ==3 );

??那么系馆,(a === 1 && a === 2 && a === 3)的值也能是true嗎送漠?
答案當然是肯定的!
??但是它呀,嚴格相等并沒有轉(zhuǎn)化的過程螺男,所以我們需要通過一些方式去調(diào)用一個函數(shù),并在這個函數(shù)中做我們想做的事情纵穿。但是執(zhí)行函數(shù)往往需要在函數(shù)名字后引入 () 下隧,并且由于這里不是寬松相等 ==valueOf將不會被JS引擎調(diào)用谓媒。幸好Object提供了一個Property函數(shù), 特別是getter描述符淆院, 帶來了解決這個問題的辦法。

var value = 0; //window.value
Object.defineProperty(window, "a", {
    get: function () {
        return  this.value += 1
    }
})
console.log( a === 1 && a === 2 && a === 3 );

??上面代碼中句惯,我們在window對象上定義了一個具有getter的 a 屬性, 通過get屬性, 我們可以調(diào)用一個函數(shù)并且不用在函數(shù)名后添加 ()土辩,所以 a 可以在代碼中直接被訪問到(全局變量), 因此也可以直接獲得a的值抢野。如果我們在其他對象上定義了屬性 a 而不是window的話拷淘,例如object1, 我們就需要改變題目為 object1.a === 1 && object1.a === 2 && object1.a === 3 了指孤。
??擴展:字符編碼實現(xiàn)相同效果

var a? = 1;
var a = 2;
var ?a = 3;
console.log(a? === 1 && a === 2 && ?a=== 3 );
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末启涯,一起剝皮案震驚了整個濱河市贬堵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌结洼,老刑警劉巖黎做,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異松忍,居然都是意外死亡蒸殿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門鸣峭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宏所,“玉大人,你說我怎么就攤上這事叽掘¢固” “怎么了玖雁?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵更扁,是天一觀的道長。 經(jīng)常有香客問我赫冬,道長浓镜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任劲厌,我火速辦了婚禮膛薛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘补鼻。我一直安慰自己哄啄,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布风范。 她就那樣靜靜地躺著咨跌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硼婿。 梳的紋絲不亂的頭發(fā)上锌半,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音寇漫,去河邊找鬼刊殉。 笑死,一個胖子當著我的面吹牛州胳,可吹牛的內(nèi)容都是我干的记焊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼栓撞,長吁一口氣:“原來是場噩夢啊……” “哼遍膜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捌归,失蹤者是張志新(化名)和其女友劉穎肛响,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惜索,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡特笋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巾兆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猎物。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖角塑,靈堂內(nèi)的尸體忽然破棺而出蔫磨,到底是詐尸還是另有隱情,我是刑警寧澤圃伶,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布堤如,位于F島的核電站,受9級特大地震影響窒朋,放射性物質(zhì)發(fā)生泄漏搀罢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一侥猩、第九天 我趴在偏房一處隱蔽的房頂上張望榔至。 院中可真熱鬧,春花似錦欺劳、人聲如沸唧取。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枫弟。三九已至,卻和暖如春腔剂,著一層夾襖步出監(jiān)牢的瞬間媒区,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工掸犬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袜漩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓湾碎,卻偏偏與公主長得像宙攻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子介褥,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第一章: JS簡介 從當初簡單的語言座掘,變成了現(xiàn)在能夠處理復雜計算和交互递惋,擁有閉包、匿名函數(shù)溢陪, 甚至元編程等...
    LaBaby_閱讀 1,673評論 0 6
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,237評論 0 4
  • 1 Object 對象 教程:https://wangdoc.com/javascript/stdlib/obje...
    智勇雙全的小六閱讀 1,763評論 0 0
  • 如何發(fā)圈萍虽,發(fā)圈的組成部分的課題我已經(jīng)寫過,相信大家也都比較清楚形真,但是在發(fā)圈內(nèi)容中那部分不與產(chǎn)品有關(guān)的圈子杉编,應...
    熙熙Breathe閱讀 254評論 0 4
  • 當你想表達什么的時候邓馒,總被告誡,“三思而后行”蛾坯,甚至有人告訴你一個方法光酣,把舌頭在嘴里轉(zhuǎn)三圈以后,再考慮要不要說脉课。好...
    風里雨里我等你閱讀 597評論 0 3