if和==這兩個(gè)判斷方式雖然都是通過布爾值來判斷結(jié)果的,但是這兩個(gè)判斷方式的原理還是有很大差距的炬灭。
if(xx)的判斷方式
關(guān)于if的判斷方式指煎,來看幾個(gè)例子。
if ("hello") {
console.log("hello")
}
if ("") {
console.log('empty')
}
if (" ") {
console.log('blank')
}
結(jié)果是什么尝偎?
第一個(gè)輸出“hello”饶火;第二個(gè)沒有結(jié)果輸出;第三個(gè)輸出“blank”致扯。
為什么呢肤寝??
我們前面說過抖僵,if與==都是通過布爾值來判斷結(jié)果的鲤看。因此,if會(huì)把后面括號(hào)內(nèi)的元素強(qiáng)制轉(zhuǎn)換為布爾值耍群,根據(jù)轉(zhuǎn)化后的結(jié)果進(jìn)行判斷义桂。
轉(zhuǎn)化規(guī)則
類型 | 結(jié)果 |
---|---|
Undefined | false |
Null | false |
Boolean | 直接判斷 |
Number | +0, ?0, 或者 NaN 為 false, 其他為 true |
String | 空字符串為 false,其他都為 true |
Object | true |
根據(jù)這個(gè)規(guī)則我們可以很清楚的知道這個(gè)式子的結(jié)果,也可控制式子得到我們想要的結(jié)果蹈垢。
==的判斷方式
在了解==的判斷方式之前我們需要先了解一下他的運(yùn)算規(guī)則慷吊。
==的運(yùn)算規(guī)則
==是進(jìn)行值的比較,而===則是進(jìn)行屬性與值的比較曹抬。前者在比較的時(shí)候Javascript會(huì)自動(dòng)的幫我們進(jìn)行屬性的轉(zhuǎn)換溉瓶,但是有時(shí)候會(huì)有一些很奇怪的問題出現(xiàn),這時(shí)候我們就需要知道它的轉(zhuǎn)換規(guī)則谤民。
- 如果兩個(gè)值類型相等堰酿,就會(huì)嚴(yán)格的執(zhí)行相等的運(yùn)算
- 如果兩個(gè)值類型不相等:
- 如果一個(gè)是null,一個(gè)是undefined张足,那么相等
- 如果一個(gè)是數(shù)字触创,一個(gè)是字符串,先將字符串轉(zhuǎn)為數(shù)字为牍,然后比較
- 如果一個(gè)值是true/false則將其轉(zhuǎn)為1/0比較
- 如果一個(gè)值是對(duì)象哼绑,一個(gè)是數(shù)字或字符串顺饮,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
- 其它就不相等了
==的判斷規(guī)則
我們還是先來看幾個(gè)例子
"" == 0
"" == false
" " == true
"hello" == true
"0.00" == false
結(jié)果是什么?
第一個(gè)結(jié)果為true凌那,第二個(gè)結(jié)果為true兼雄,第三個(gè)結(jié)果為false,第四個(gè)結(jié)果為false帽蝶,第五個(gè)結(jié)果為true赦肋。
為什么呢?励稳?
x | y | 結(jié)果 |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
otherwise | otherwise | false |
這是==在計(jì)算時(shí)的大體轉(zhuǎn)化規(guī)則佃乘,具體的某些計(jì)算方式如下:
toNumber
類型 | 返回結(jié)果 |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | ture -> 1, false -> 0 |
String | “abc” -> NaN, “123” -> 123 |
toPrimitive
對(duì)于 Object 類型,先嘗試調(diào)用 .valueOf 方法獲取結(jié)果驹尼。 如果沒定義趣避,再嘗試調(diào)用 .toString方法獲取結(jié)果。
這些是if(xx)和 “==”的判斷規(guī)則新翎。有時(shí)候搞清楚原理有助于我們更好的工作程帕,寫出不被評(píng)價(jià)為爛代碼的東西。