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

??之前在社區(qū)看到這道題時,我第一反應就是如果我在代碼庫中看到這樣的代碼我肯定是很絕望的?。。⊙詺w正傳,看到這題的時候,我首先想到的是(a == 1 && a == 2 && a==3)為true的情況(寬松匹配),我們先了解這種情況,然后在解決擴展問題。
??首先,在JS中,寬松匹配 ==會先將左右兩兩邊的值轉化成相同的原始類型,然后再去比較他們是否相等。在轉化之后(== 一邊或兩邊都需要轉化),最后的相等匹配會像 ===符號一樣去執(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ù)組轉換成字符串的時候,數(shù)組toString會隱含調用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嗎?
答案當然是肯定的!
??但是,嚴格相等并沒有轉化的過程,所以我們需要通過一些方式去調用一個函數(shù),并在這個函數(shù)中做我們想做的事情。但是執(zhí)行函數(shù)往往需要在函數(shù)名字后引入 () ,并且由于這里不是寬松相等 ==, valueOf將不會被JS引擎調用。幸好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屬性, 我們可以調用一個函數(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 );
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

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

友情鏈接更多精彩內容