一點(diǎn)有意思的分享
今天刷視頻看到一個(gè)逆天代碼。

大致是這樣的,于是有人說(shuō),你為什么不寫(xiě)成“user || null?”呢?這是一個(gè)很有意思的思考。在編寫(xiě)代碼和簡(jiǎn)化的時(shí)候,一定要注意代碼的等效。即兩段不同的代碼在無(wú)論輸入任何值時(shí),都有相同的結(jié)果,這樣的代碼才是等效的。簡(jiǎn)化代碼時(shí),如果不考慮等效就有可能出各種BUG。比如上例:
在JS中,當(dāng)變量的值是 false, 0, "", null undifined, document.all 中的任何一個(gè)時(shí),都會(huì)被視為false,這個(gè)也就是所謂的falsy。而原代碼要求的判斷條件是 不為null 。這個(gè)絕對(duì)不可以簡(jiǎn)寫(xiě)為 if (!user) 這是不相同的判斷條件。在這里,空字符串和0有可能根據(jù)需求有其它含義。
另外,有人說(shuō)三元運(yùn)算符的可讀性不好,其實(shí)這個(gè)也有問(wèn)題。三元運(yùn)算符的效率和if語(yǔ)句是不一樣的:

多次執(zhí)行此程序,要以看出三元運(yùn)算符通常會(huì)比if語(yǔ)句要快一些。當(dāng)然,對(duì)于JS程序,這種效率優(yōu)化完全沒(méi)有任何意義,有些弱智的編譯器還會(huì)幫你優(yōu)化。但了解這個(gè)知識(shí),我認(rèn)為是沒(méi)有問(wèn)題的。而且說(shuō),三元運(yùn)算符所在的語(yǔ)句是表達(dá)式語(yǔ)句,他有一個(gè)結(jié)果。而if所在的語(yǔ)句是控制語(yǔ)句,他只負(fù)責(zé)流程,所以,二者的作用不相同,目的不相同,也沒(méi)有放在一起比較的必要。例如本例,使用三元運(yùn)算符即精簡(jiǎn)代碼,又符合三元運(yùn)算符本身的含義,自然是推薦使用的。