??? 最近看review同事的代碼上煤,發(fā)現他定義一個變量但不賦值時,經常將這個其設為null(let a = null;)奇瘦,而非我經常只定義不賦值時的undefined(let a;),所以下意識的就得自己一定是忽略了什么,于是花了點點時間來了解了下二者的卻別演痒,帶著下面的問題為,我們來開始我們的剖析趋惨。
定義變量但"不賦值"的話鸟顺,到底需不需要將其設為null?
一器虾、相似性
? ? 老實說在js中將一個變量設為null或undefined幾乎沒什么區(qū)別讯嫂,幾乎是等價的。在if語句中二者都會被轉化成false,做相等運算時兆沙,二者還相等欧芽。?
? ? if (null) { console.log('null is false') }? ? =====>? ? 輸出'null is false'
? ? if (undefined) { console.log('null is false') }? ? =====>? ? 輸出'undefined is false'
? ? undefined? == null? ??=====>? ? 輸出true
二、既然二者如此相似葛圃,為什么js還要設置這樣的兩個值千扔?
? ? 原來JavaScript誕生之初,最初像Java一樣库正,只設置了null作為表示"無"的值曲楚。
? ? ① null像在Java里一樣,被當成一個對象褥符。但是洞渤,JavaScript的數據類型分成基本類型和引用類型兩大類,Brendan Eich覺得表示"無"的值最好不是對象属瓣。
? ? ②?JavaScript的最初版本沒有包括錯誤處理機制载迄,發(fā)生數據類型不匹配時,往往是自動轉換類型或者默默地失敗抡蛙。Brendan Eich覺得护昧,如果null自動轉為0(Number(null)? =====>? 輸出0),很不容易發(fā)現錯誤粗截,所以Brendan Eich又設計了一個undefined(Number(undefined)? =====>? 輸出NaN)惋耙。
三、二者目前的用法
? ? null表示"沒有對象",即該處不應該有值绽榛。典型用法:
? ? ① 作為函數的參數湿酸,表示該函數的參數不是對象;
? ? ② 大家都知道js對象的老祖宗Object.prototype灭美,但是大家有沒想過Object.prototype.__proto__是什么值推溃,其實是null,而非undefined届腐;
? ? undefined表示"缺少值"铁坎,就是此處應該有一個值,但是還沒有定義犁苏。典型用法:
? ? ① 變量被聲明了硬萍,但沒有賦值時,就等于undefined围详;
? ? ②?調用函數時朴乖,應該提供的參數沒有提供,該參數等于undefined助赞;
? ? ③?對象沒有賦值的屬性寒砖,該屬性的值為undefined;
? ? ④?函數沒有返回值時嫉拐,默認返回undefined哩都;
? ? 綜上幾點看來,個人覺得聲明的變量未賦值時還是按其默認的undefined為好(若確定這個變量后面會被賦值成一個對象婉徘,設null也可)漠嵌,強行解釋,原由如下:
? ? ① 減少代碼量盖呼;
? ? ② 通常值設為null表示其值后面會設為一個對象儒鹿,但是js作為一個弱類型的語言,變量有時基本類型引用類型都有可能被賦值上几晤;
? ?③ null在做計算操作時會被轉換成0參與計算约炎,當定義的變量沒被賦上值,且參與了計算蟹瘾,頁面不會報錯圾浅,出現了bug不易發(fā)現。