在所有編程語言中if是最長用的判斷之一,但在js中到底哪些東西可以在if中式作為判斷表達式呢?
例如如何幾行,只是少了一個括號,真假就完全不同,到底表示什么含義呢
1 var obj={}; 2 obj.Funtext=function(){}; 3 if(obj.Funtext) 4 { 5 alert("true obj.Funtext;"); 6 } 7 else 8 { 9 alert("false obj.Funtext"); 10 } 11 obj.Funtext=function(){}; 12 if(obj.Funtext()) 13 { 14 alert("true obj.Funtext();"); 15 } 16 else 17 { 18 alert("false obj.Funtext()"); 19 }
1第一類已定義的變量但未賦值在if中認為是假
例如:
1 var t; 2 if(t) 3 { 4 alert("true 已定義未賦值"); 5 } 6 else 7 { 8 alert("false 已定義未賦值"); 9 }
2第二類已定義的變量,賦值為空字符串在if中認為是假,賦值為其他的字符串,也就是是字符串中有字符就認為是真
例如
1 var t; 2 t=" "; 3 if(t) 4 { 5 alert("true t=' ';"); 6 } 7 else 8 { 9 alert("false t=' '"); 10 } 11 t="111"; 12 if(t) 13 { 14 alert("true t='111';"); 15 } 16 else 17 { 18 alert("false t='111'"); 19 }
if判斷是真,也就是對於字符串類型,只要有字符,即使是空格字符if判斷也為真。
3第三類已定義的變量,賦值為true在if中認為是真,賦值為false,則為假,這和其他語言中bool的類型的變量是一樣的。
例如:
1 var t; 2 t=false; 3 if(t) 4 { 5 alert("true t=false;"); 6 } 7 else 8 { 9 alert("false t=false;"); 10 } 11 t=true; 12 if(t) 13 { 14 alert("true t=true;"); 15 } 16 else 17 { 18 alert("false t=true;"); 19 }
4第四類已定義的變量,賦值為0在if中則為假,其他數值認為是真,這和c語言中數值的類型的變量是一樣的。
例如:
1 var t; 2 t=0; 3 if(t) 4 { 5 alert("true t=0;"); 6 } 7 else 8 { 9 alert("false t=0;"); 10 } 11 t=0.0; 12 if(t) 13 { 14 alert("true t=0.0;"); 15 } 16 else 17 { 18 alert("false t=0.0;"); 19 }
測試發現不管是0,還是0.0都是假
1 var t; 2 t=2; 3 if(t) 4 { 5 alert("true t=2;"); 6 } 7 else 8 { 9 alert("false t=2;"); 10 }
發現非0是都是真
5第五類js中的特殊值null,undefined,都是假
1 var t=null; 2 if(t) 3 { 4 alert("true t=null;"); 5 } 6 else 7 { 8 alert("false t=null;"); 9 } 10 t=undefined; 11 if(t) 12 { 13 alert("true t=undefined;"); 14 } 15 else 16 { 17 alert("false t=undefined;"); 18 }
由於在js中未定義的變量默認值是undefined,因此這也就就解釋了第一類情況
6第六類已定義的函數,根據調用方式又分為兩種
第一種:不帶括號的,如果定義了就是真,沒有定義會報錯
1 function testfunction(){} 2 if(testfunction) 3 { 4 alert("true testfunction;"); 5 } 6 else 7 { 8 alert("false testfunction;"); 9 }
第二種:帶括號的,其實相當於調用函數,自然是根據函數的返回值判斷真假
例如:
1 function testfunction(){} 2 if(testfunction()) 3 { 4 alert("true testfunction;"); 5 } 6 else 7 { 8 alert("false testfunction;"); 9 }
是假,是因為,函數如果沒有定義返回值值,則返回值是undefined
7第七類已定義的對象,未賦值時在if中則為假,賦值后是真。
例如:
1 var obj; 2 if(obj) 3 { 4 alert("true obj;"); 5 } 6 else 7 { 8 alert("false obj;"); 9 }
其實由於在js中變量在沒有賦值時是沒有類型的,因此和第一種情況是一樣的。
但在賦值后,就會變成真,例如:
1 var <span style="font-family: Arial, Helvetica, sans-serif;">obj</span> 2 ; 3 obj={}; 4 if(obj) 5 { 6 alert("true obj={};"); 7 } 8 else 9 { 10 alert("false obj={};"); 11 }
8第八類已定義的對象的屬性字段,和單獨的變量是一樣的,例如數值型為0時是假,其他為真,字符串型是為空值時是假,其他為真。
例如
1 var obj={}; 2 obj.Text=""; 3 if(obj.Text) 4 { 5 alert("true obj.Text;"); 6 } 7 else 8 { 9 alert("false obj.Text"); 10 } 11 obj.Text="Text"; 12 if(obj.Text) 13 { 14 alert("true obj.Text;"); 15 } 16 else 17 { 18 alert("false obj.Text"); 19 } 20 obj.Text=0; 21 if(obj.Text) 22 { 23 alert("true obj.Text;"); 24 } 25 else 26 { 27 alert("false obj.Text"); 28 } 29 obj.Text=1; 30 if(obj.Text) 31 { 32 alert("true obj.Text;"); 33 } 34 else 35 { 36 alert("false obj.Text"); 37 }
9第九類已定義的對象的方法,和單獨的函數是一樣的,
不加括號是如果沒定義就是假,
1 var obj={}; 2 obj.Funtext=function(){}; 3 if(obj.Funtext) 4 { 5 alert("true obj.Funtext;"); 6 } 7 else 8 { 9 alert("false obj.Funtext"); 10 } 11 if(obj.Funtext1)//未定義屬性,也沒有定義方法 12 { 13 alert("true obj.Funtext1;"); 14 } 15 else 16 { 17 alert("false obj.Funtext1"); 18 }
加了括號相當於調用方法,就是根據返回值判斷真假。
1 var obj={}; 2 obj.Funtext=function(){}; 3 if(obj.Funtext()) 4 { 5 alert("true obj.Funtext();"); 6 } 7 else 8 { 9 alert("false obj.Funtext()"); 10 } 11 obj.Funtext2=function(){ return "ff"}; 12 if(obj.Funtext2()) 13 { 14 alert("true obj.Funtext2();"); 15 } 16 else 17 { 18 alert("false obj.Funtext2()"); 19 }
可以看到在js中可以在if中作為判斷的類型很多,但最終都可以看做這些類型的變形。只要掌握了這些最基本的,就可以靈活運用if判斷了。
最基本是null,undefined,if判斷都是假;對於數值類型,0是假,其他為真;對於字符類型空字符串是假,其他為真,對於方法屬性,如果定義了就是真,否則就是假,其他所有都可以看做是這些的變相應用。