可能入坑不久的同學(xué)還會(huì)用著if (value !== null || Value !== undefined)
這樣的判斷語(yǔ)句, 而實(shí)際上只要理解判定的規(guī)則, 善用規(guī)則, 就能大大的提高代碼的可讀性. 接下來(lái)讓我們深入學(xué)習(xí)一下.
大多編程語(yǔ)言中最為常用的一個(gè)語(yǔ)句就是if
語(yǔ)句, 這種條件語(yǔ)句是通過(guò)判斷指定表達(dá)式的值來(lái)決定執(zhí)行還是跳過(guò)某些語(yǔ)句. 它的語(yǔ)法如下:
if (Expression) {
statement
}
其中Expression(表達(dá)式/條件)可以是任意表達(dá)式或者值.
- 首先它會(huì)解析表達(dá)式的值
- 如果表達(dá)式是無(wú)法解析的, 會(huì)報(bào)
ReferenceError
的錯(cuò)誤并停止. 如果不是則繼續(xù). - 判斷值的引用類(lèi)型, 如果是布爾值, 字符串和符號(hào)則繼續(xù).
null
和undefined
永遠(yuǎn)都返回 false. - 將值傳入
toBoolean(exprValue)
根據(jù)下面的規(guī)則轉(zhuǎn)換為布爾值.
value | Boolean |
---|---|
未定義(Undefined) | false |
空值(null) | false |
布爾值(Boolean) | 返回參數(shù)本身 |
數(shù)字(Number) | 如果參數(shù)是+0 , -0 或NaN 意蛀,則返回false ; 否則返回true
|
字符串(String) | 如果參數(shù)是空字符串(長(zhǎng)度為零)升酣,則返回false ; 否則返回true
|
Symbol | 返回 true |
Object | 返回 true |
這里我們得出undefined
, null
, NaN
, 空字符串, 和數(shù)字 0 都是過(guò)不了條件語(yǔ)塊的規(guī)則, 因此我們可以利用這一點(diǎn)來(lái)對(duì)代碼進(jìn)行簡(jiǎn)寫(xiě).
var userName = 'hello';
var flag = false;
// bad code
if (value != undefined) {
...
}
// bad code
if (value !== undefined || value !== null || value !== false) {
...
}
// good code
if (userName) {
something...
}
// flag鎖, 利用取反轉(zhuǎn)換布爾值
if (!flag) {
flag = true;
something...
}
相同的, 也沒(méi)有必要去使用==
規(guī)范不推薦的方式去隱式轉(zhuǎn)換類(lèi)型, 這種規(guī)則同樣適用于三目運(yùn)算符
, switch
等條件運(yùn)算中去... 這樣看起來(lái)是不是自己的代碼整潔多了呢~
后記: 才疏學(xué)淺, 如果有什么說(shuō)的不對(duì)或者需要改進(jìn)的地方, 可以給我留言大家一起交流. 原創(chuàng)不易, 如果文章對(duì)你有幫助的話(huà)就隨手點(diǎn)個(gè)贊鼓勵(lì)一下唄~
最后安利一下自己的個(gè)人博客, 不定期更新自己踩的坑和一些冷門(mén)的小知識(shí): https://anran758.github.io/blog/
參考資料
ECMA-262 官方文檔
http://www.ecma-international.org/ecma-262/6.0/#sec-if-statement