一、if(xx)的判斷
對于括號里的表達式愉耙,會被強制轉(zhuǎn)換為布爾值。
原理
類型 | 結(jié)果 |
---|---|
Undefined | false |
Null | false |
Boolean | 直接判斷 |
Number | +0哑梳,-0劲阎,0.00,或者NaN為false,其他為true |
String | 空字符串為false鸠真,其他都為true |
Object | true |
- 當if括號內(nèi)的表達式為Undefined時悯仙,為false。
if(undefined) {
console.log("hello")
} // 不輸出
- 當if括號內(nèi)的表達式為Null時吠卷,為false锡垄。
if(null) {
console.log("hello")
} // 不輸出
- 當if括號內(nèi)的表達式為Boolean時,直接判斷祭隔。
if(true) {
console.log("hello")
} // hello
if(false) {
console.log("hello")
} // 不輸出
- 當if括號內(nèi)的表達式為Number時货岭,如果number為+0,-0疾渴,0.00或者NaN為false千贯,其他為true。
if(0.00) {
console.log("hello")
} // 不輸出
if(NaN) {
console.log("hello")
} // 不輸出
if(1) {
console.log("hello")
} // hello
- 當if括號內(nèi)的表達式為String時搞坝,如果string為空字符串為false搔谴,其他為true。
if("") {
console.log("hello")
} // 不輸出
if(" ") {
console.log("hello")
} // hello
- 當if括號內(nèi)的表達式為Object時桩撮,為true敦第。
if([]) {
console.log("hello")
} // hello
二、==的判斷
在js判斷兩個變量值是否相等店量,可以使用==相等或===嚴格相等操作符芜果。
==判斷兩個值是否相等,相同類型直接比較融师,不同類型需要對類型進行轉(zhuǎn)換再比較右钾。
解密
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 |
toNumber
type | Result |
---|---|
undefined | NaN |
Null | 0 |
boolean | true->1,false->0 |
string | "abc"->NaN,"123"->123 |
- null==undefined
undefined和null與其他類型的值比較時霹粥,結(jié)果都為false灭将,它們互相比較時結(jié)果為true疼鸟。或undefined/null與對象比較時空镜,對象轉(zhuǎn)為原始值得到undefined,會返回true吴攒。
null == 0 // false
null == 1 // false
undefined == 0 // false
undefined == 1 // false
null == undefined // true
- Number==String ---> toNumber(string) == number
"" == 0 // true,Number("")===0
" " == 0 // true洼怔,Number(" ")===0
"1"== 1 // true署惯,Number("1")===1
"hello" == 1 // false,Number("hello")為NaN
"hello" == 0 // false镣隶,Number("hello")為NaN
!" "==1 // false,
取反運算符“!”會返回布爾值安岂,且優(yōu)先級比相等運算符高:空白字符串為true,所以取反的布爾值為false域那,Number(false)===0
- Boolean==(any) ---> toNumber(boolean) == (any)
1 == true // true咙边,Number(true)===1
0 == false // true,Number(false)===0
"+0" == true // false次员,Number("+0")===0,Number(true)===1
"-0" == true // false败许,Number("-0")===0,Number(true)===1
"0.00" == false // true淑蔚,Number("0.00")===0,Number(false)===0
- Object==String/Number ---> toPrimitive(object)
對于 Object (指廣義對象,包括數(shù)組和函數(shù))類型束倍,先嘗試調(diào)用 .valueOf 方法獲取結(jié)果,如果沒有定義甥桂,再嘗試調(diào)用 .toString 方法獲取結(jié)果邮旷。
true == {} // false
[] == true // false
var obj = {
a: 0;
valueOf: function(){return 1}
}
obj == 1 // true黄选,返回值為1
obj == true // true,Number(true)===1
obj == "[object object]" // false
相等運算符(==)隱藏的類型轉(zhuǎn)換比較容易出錯办陷,所以最好使用嚴格相等運算符(===)。