if(condition) VS a == b
你真的了解判斷語句嗎?
判斷語句是程序設(shè)計(jì)中最基本的語句,我們無時無刻不在與其產(chǎn)生交集,或許在看到這篇文章的前一秒,你正寫完一個條件判斷以滿足功能需求。但是,有時候碰到一些奇怪的面試題,我們或許會懷疑“我真的了解判斷語句嗎?”。
牛刀小試
if("hello") {
console.log("hello");
}
if("") {
console.log("empty);
}
if(" ") {
console.log("blank");
}
if("[0]") {
console.log("array");
}
if("0.00") {
console.log("0.00")
}
上面的是不是so easy,可能都覺得有些無聊了QAQ,嘿,先別走啊,再看看下面的。
"" == 0
" " == 0
"" == true
" " == true
!" " == true
"hello" == true
"0" == true
undefined == null
{} == true
[] == true
var obj = {
a: 0,
valueOf: function() {return 1}
}
obj == "[object Object]"
obj == 1
obj == true
嗯~,好像需要思考了,,,接下來,我們來了解一些判斷的內(nèi)部比較原理。
言歸正傳
對于if(condition)
對于if括號中的表達(dá)式(這里指單個變量),會被強(qiáng)制轉(zhuǎn)化為Boolean類型,轉(zhuǎn)化規(guī)則如下:
| 類型 | 結(jié)果 |
|---|---|
| undefined | false |
| null | false |
| Boolean | 直接判斷 |
| Number | +0、-0、NaN為false,其他為true |
| String | 空字符串為false,其他都為true |
| Object | true |
對于x == y類型判斷
結(jié)果映射為下:
| x | y | 結(jié)果 |
|---|---|---|
| null | undefined | true |
| Number | String | x == toNumber(y) |
| Boolean | (any) | toNumber(x) == y |
| Object | String or Number | toPrimitive(x) == y |
上表中的toNumber表示強(qiáng)制轉(zhuǎn)化為Number,轉(zhuǎn)化規(guī)則如下:
| Type | Result |
|---|---|
| undefined | NaN |
| null | 0 |
| Boolean | true -> 1,false -> 0 |
| String | "abc" -> NaN,"123" -> 123 |