初學(xué)js時(shí)菌瘫,發(fā)現(xiàn)if()中判斷的結(jié)果和==的判斷結(jié)果竟然不太一樣誒奈偏,真的是非常地有貓病了飞几。下面根據(jù)js的6中數(shù)據(jù)類型后室,對兩者進(jìn)行對比說明缩膝!
1. if()的判斷
括號里的數(shù)據(jù)強(qiáng)制轉(zhuǎn)化成Boolean來判斷
數(shù)據(jù)類型 | 結(jié)果 |
---|---|
Undefined | false |
Null | false |
Boolean | 輸入即輸出 |
Number | +0, ?0, NaN為false;其余為true |
String | ""為false( length 是0);其余為true |
Object | object為null或undefined時(shí)岸霹,為false疾层;否則為true. |
2. == 判斷
2.1 對于左右兩端數(shù)據(jù)類型一致的,==操作與===操作是一致的贡避。
需要注意的是:
- NaN == NaN 返回false
- Undefined == Undefined 返回true
- Null == Null 返回true
- == 兩端為非空對象時(shí)痛黎,兩個(gè)對象內(nèi)存地址一致時(shí)返回true予弧,否則返回false
2.2 對于左右兩端數(shù)據(jù)類型不一致的,需要對數(shù)據(jù)進(jìn)行轉(zhuǎn)化湖饱。
轉(zhuǎn)化規(guī)則如下:
一端(x) | 另一端(y) | 結(jié)果 |
---|---|---|
Null | Undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Number | Object | x == toNumber(y) |
String | Object | x == toPrimitive(y) |
其他情況 | false |
總結(jié)來說:
- 任意一端為Boolean的掖蛤,先把Boolean轉(zhuǎn)化為Number,再跟另一端比較
- 一端為Number井厌,一端為String的蚓庭,把String轉(zhuǎn)化為Number
- 一端為Number,一端為Object的仅仆,先調(diào)用Object的valueof方法器赞,若沒有再調(diào)用tostring方法;再進(jìn)行比較
- 一端為Number墓拜,另一端為Null/Undefined的港柜,返回false
- 其它不屬于上述場景,且無法轉(zhuǎn)換為上述場景的撮弧,返回false
轉(zhuǎn)化為number的規(guī)則:
type | result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | true為1潘懊,false為0 |
Number | 輸入即輸出 |
String | "abc" -> NaN,"123"-> 123贿衍,"+1.23 ">"1.23"授舟,"+1.2.1"->NaN |
Object | 先調(diào)用valueof,若有結(jié)果根據(jù)上面規(guī)則轉(zhuǎn)換贸辈;若無結(jié)果調(diào)用tostring释树,然后根據(jù)上面規(guī)則轉(zhuǎn)換 |
3. 實(shí)例解析
if()判斷實(shí)例
題目1:如下代碼輸出什么?
if ("hello") {
console.log("hello")
}
題目2:如下代碼輸出什么?
if ("") {
console.log('empty')
}
題目3:如下代碼輸出什么?
if (" ") {
console.log('blank')
}
題目4:如下代碼輸出什么?
if('0.00'){
console.log('0.00')
}
- if()判斷括號中為String字符串時(shí),若為空串擎淤,即不包括任意字符的字串奢啥,為false,否則為true嘴拢;
因此問題1輸出結(jié)果為"hello"桩盲;
問題2輸出結(jié)果為不輸出;
問題3輸出結(jié)果為"blank"席吴;
問題4輸出結(jié)果為"0.00"赌结;
題目5:如下代碼輸出什么?
if ([0]) {
console.log('array')
}
- if()判斷括號中為對象時(shí),對象不為空孝冒,判斷為true柬姚;
因此問題5輸出結(jié)果為"array";
題目6:如下代碼輸出什么?
if (1) {
console.log('true')
}
if (0) {
console.log('error')
}
if (0.00) {
console.log('hehe')
}
- if()判斷括號中為數(shù)字時(shí)庄涡,非0量承,判斷為true;否則為false
因此問題6輸出結(jié)果為"true";
==判斷實(shí)例
"" == 0 //題目1
" " == 0 //題目2
"" == true //題目3
"" == false //題目4
" " == true //題目5
- 兩端數(shù)據(jù)類型不一樣時(shí)撕捍,且兩端為Number和String時(shí)拿穴,將String都轉(zhuǎn)化為Number進(jìn)行比較:
""轉(zhuǎn)化為Number是0,因此題目1返回true
" "轉(zhuǎn)化為Number是0卦洽,因此題目2返回true - 有一端為Boolean時(shí)贞言,將Boolean先轉(zhuǎn)化為Number斜棚,再進(jìn)行比較:
true轉(zhuǎn)化為Number是1阀蒂,false轉(zhuǎn)化為Number是0,比較Number和String
""轉(zhuǎn)化為Number是0弟蚀,因此題目3返回false蚤霞,題目4返回true
" "轉(zhuǎn)化為Number是0,因此題目5返回false
!" " == true //題目6
!" " == false //題目7
"hello" == true //題目8
"hello" == false //題目9
"0" == true //題目10
"0" == false //題目11
"00" == false //題目12
"0.00" == false //題目13
- !為非操作义钉,先將要操作都表達(dá)式轉(zhuǎn)化為Boolean昧绣," "不是空串,轉(zhuǎn)化為Boolean后為true捶闸,進(jìn)行非操作后為false夜畴;兩端數(shù)據(jù)類型一致,都為Boolean型删壮,直接比較贪绘,
因此題目6返回false
因此題目7返回true - 一端是Boolean,一端是String央碟,先將Boolean轉(zhuǎn)化為Number税灌;比較Number和String,將String轉(zhuǎn)化為Number再進(jìn)行比較:
true轉(zhuǎn)化為Number是1
false轉(zhuǎn)化為Number是0
"hello"轉(zhuǎn)化為Number是NaN
因此題目8返回false
因此題目9返回false
"0"亿虽,"00"菱涤,"0.00"轉(zhuǎn)化為Number是0
因此題目10返回false
因此題目11返回true
因此題目12返回true
因此題目13返回true
undefined == null //題目14
{} == true //題目15
[] == true //題目16
var obj = {
a: 0,
valueOf: function(){return 1}
}
obj == "[object Object]" //題目17
obj == 1 //題目18
obj == true //題目19
- undefined == null ,題目14返回true
- 一端是Boolean洛勉,一端是其它粘秆,先將Boolean轉(zhuǎn)化為Number再進(jìn)行比較;一端是Number收毫,一端是Object攻走,調(diào)用Object的valueof或tostring方法:
{}調(diào)用valueof無返回值,調(diào)用tostring返回"[object Object]",比較Number與String牛哺。"[object Object]"轉(zhuǎn)化為數(shù)字是NaN陋气,NaN與1比較返回false,題目15返回false
[]調(diào)用valueof沒有結(jié)果引润,調(diào)用tostring返回"",轉(zhuǎn)化為數(shù)字是0巩趁,題目16返回false
obj調(diào)用valueof得到1,題目19結(jié)果為true - Object和String比較,先Object調(diào)用valueof得到1议慰,比較Number與String蠢古;"[object Object]"轉(zhuǎn)化為Number為NaN,題目17結(jié)果為false
- Object和Number比較别凹,先Object調(diào)用valueof得到1草讶,比較Number;題目18結(jié)果為true