近期做項目對JavaScript的類型判斷用到了很多,由于有時候用typeof 有時候用 === 有時候用constructor,弄得自己有些頭大,于是做了下面最簡單的一個代碼測試。從測試結(jié)果我得出,要判斷嚴格判斷一個變量的類型應該用 === + typeof,=== + typeof 可以準確判斷出5種類型,分別是:number, string, boolean, undefined, function 這個組合無法分辨object和array ,如果要嚴格區(qū)分Array 和Object就只有用 constructor + === 來判斷了,一個undefined的變量是不能取constructor的,會報錯!
這里要注意一下,用typeof 返回的是一個字符串,而且都是小寫,所以用typeof的時候得這樣寫,如判斷變量是否為string :if(typeof xx === "string") , 而 constructor返回的是一個對象 ,所以用constructor的時候得這樣寫,如判斷變量xx是否為 Array if(xx && xx.constructor === Array) 前面的if (xx && 是首先判斷 xx, 保證xx不為 undefined 且 不為null)
Ok 現(xiàn)在上代碼
<script>
var a = 1, b = "1", c = true;
var d, e = [], f= {},g = null;
var w = function(s) {document.write(s+ "<br />");};
//首先聲明了一些變量和一個函數(shù)用于下面的測試
/**********測試開始**********/
w("typeof a: " + typeof a);
w("typeof b: " + typeof b);
w("typeof c: " + typeof c);
w("typeof d: " + typeof d);
w("typeof e: " + typeof e);
w("typeof f: " + typeof f);
w("typeof w: " + typeof w);
w("<br>a.constructor: " + a.constructor);
w("b.constructor: "+ b.constructor);
w("c.constructor: " + c.constructor);
w("d.constructor: 會報錯");
w("e.constructor: " + e.constructor);
w("f.constructor: "+ f.constructor);
w("w.constructor: "+ w.constructor);
w("g.constructor: 會報錯");
if(e && e.constructor === Array) w("<br />(e && e.constructor === Array) works");
if(e && e.constructor == Array) w("(e && e.constructor == Array) works");
if(w && w.constructor === Function) w("(w && w.constructor === Function) works" );
if(w && w.constructor == Function) w("(w && w.constructor == Function) works" );
if(d==undefined) w("<br />(d==undefined) works");
if(d==null)w("(d==null) works");
if(d===undefined) w("(d===undefined) works");
if(null == undefined) w("(null == undefined) works")
if(null === undefined) w("(null === undefined) works"); else w("(null === undefined) does not work")
if(a==b) w("(1==\"1\") works")
if(a===b) w("(1===\"1\") works"); else w("(1===\"1\") does not work");
</script>
我這邊用測試結(jié)果如下:

測試結(jié)果:
typeof a: number
typeof b: string
typeof c: boolean
typeof d: undefined
typeof e: object
typeof f: object
typeof w: function
a.constructor: function Number() { [native code] }
b.constructor: function String() { [native code] }
c.constructor: function Boolean() { [native code] }
d.constructor: 會報錯
e.constructor: function Array() { [native code] }
f.constructor: function Object() { [native code] }
w.constructor: function Function() { [native code] }
g.constructor: 會報錯
(e && e.constructor === Array) works
(e && e.constructor == Array) works
(w && w.constructor === Function) works
(w && w.constructor == Function) works
(d==undefined) works
(d==null) works
(d===undefined) works
(null == undefined) works
(null === undefined) does not work
(1=="1") works
(1==="1") does not work
PS : 會報錯是我加上去的,測試過一定會報錯的,所以用中文字代替了