在所有程式設計語言中if是最長用的判斷之一,但在js中到底哪些東西可以在if中式作為判斷運算式呢。
例如如何幾行,只是少了一個括弧,真假就完全不同,到底表示什麼含義呢
var obj={}; obj.Funtext=function(){}; if(obj.Funtext) { alert("true obj.Funtext;"); } else { alert("false obj.Funtext"); } obj.Funtext=function(){}; if(obj.Funtext()) { alert("true obj.Funtext();"); } else { alert("false obj.Funtext()"); }
1第一類已定義的變數但未賦值在if中認為是假
例如:
var t; if(t) { alert("true 已定義未賦值"); } else { alert("false 已定義未賦值"); }
2第二類已定義的變數,賦值為空白字串在if中認為是假,賦值為其他的字串,也就是是字串中有字元就認為是真
例如:
var t; t=""; if(t) { alert("true t='';"); } else { alert("false t=''"); }
if判斷是假再例如:
var t; t=" "; if(t) { alert("true t=' ';"); } else { alert("false t=' '"); } t="111"; if(t) { alert("true t='111';"); } else { alert("false t='111'"); }
if判斷是真,也就是對於字串類型,只要有字元,即使是空白字元if判斷也為真。
3第三類已定義的變數,賦值為true在if中認為是真,賦值為false,則為假,這和其他語言中bool的類型的變數是一樣的。
例如:
var t; t=false; if(t) { alert("true t=false;"); } else { alert("false t=false;"); } t=true; if(t) { alert("true t=true;"); } else { alert("false t=true;"); }
4第四類已定義的變數,賦值為0在if中則為假,其他數值認為是真,這和c語言中數值的類型的變數是一樣的。
例如:
var t; t=0; if(t) { alert("true t=0;"); } else { alert("false t=0;"); } t=0.0; if(t) { alert("true t=0.0;"); } else { alert("false t=0.0;"); }
測試發現不管是0,還是0.0都是假
var t; t=2; if(t) { alert("true t=2;"); } else { alert("false t=2;"); }
發現非0是都是真
5第五類js中的特殊值null,undefined,都是假
var t=null; if(t) { alert("true t=null;"); } else { alert("false t=null;"); } t=undefined; if(t) { alert("true t=undefined;"); } else { alert("false t=undefined;"); }
由於在js中未定義的變數預設值是undefined,因此這也就就解釋了第一類情況
6第六類已定義的函數,根據調用方式又分為兩種
第一種:不帶括弧的,如果定義了就是真,沒有定義會報錯
function testfunction(){} if(testfunction) { alert("true testfunction;"); } else { alert("false testfunction;"); }
第二種:帶括弧的,其實相當於調用函數,自然是根據函數的傳回值判斷真假
例如:
function testfunction(){} if(testfunction()) { alert("true testfunction;"); } else { alert("false testfunction;"); }
是假,是因為,函數如果沒有定義傳回值值,則傳回值是undefined
7第七類已定義的對象,未賦值時在if中則為假,賦值後是真。
例如:
var obj; if(obj) { alert("true obj;"); } else { alert("false obj;"); }
其實由於在js中變數在沒有賦值時是沒有類型的,因此和第一種情況是一樣的。
但在賦值後,就會變成真,例如:
var obj={}; if(obj) { alert("true obj={};"); } else { alert("false obj={};"); }
8第八類已定義的對象的屬性欄位,和單獨的變數是一樣的,例如數值型為0時是假,其他為真,字串型是為空白值時是假,其他為真。
例如
var obj={}; obj.Text=""; if(obj.Text) { alert("true obj.Text;"); } else { alert("false obj.Text"); } obj.Text="Text"; if(obj.Text) { alert("true obj.Text;"); } else { alert("false obj.Text"); } obj.Text=0; if(obj.Text) { alert("true obj.Text;"); } else { alert("false obj.Text"); } obj.Text=1; if(obj.Text) { alert("true obj.Text;"); } else { alert("false obj.Text"); }
9第九類已定義的對象的方法,和單獨的函數是一樣的,
不加括弧是如果沒定義就是假,
var obj={}; obj.Funtext=function(){}; if(obj.Funtext) { alert("true obj.Funtext;"); } else { alert("false obj.Funtext"); } if(obj.Funtext1)//未定義屬性,也沒有定義方法 { alert("true obj.Funtext1;"); } else { alert("false obj.Funtext1"); }
加了括弧相當於調用方法,就是根據傳回值判斷真假。
var obj={}; obj.Funtext=function(){}; if(obj.Funtext()) { alert("true obj.Funtext();"); } else { alert("false obj.Funtext()"); } obj.Funtext2=function(){ return "ff"}; if(obj.Funtext2()) { alert("true obj.Funtext2();"); } else { alert("false obj.Funtext2()"); }
可以看到在js中可以在if中作為判斷的類型很多,但最終都可以看做這些類型的變形。只要掌握了這些最基本的,就可以靈活運用if判斷了。
最基本是null,undefined,if判斷都是假;對於數實值型別,0是假,其他為真;對於字元類型Null 字元串是假,其他為真,對於方法屬性,如果定義了就是真,否則就是假,其他所有都可以看做是這些的變相應用。