javascript 的數(shù)據(jù)分為兩種:簡單數(shù)據(jù)和復(fù)雜數(shù)據(jù)。簡單數(shù)據(jù)包含 number,string,boolean,undefined 和 null 這五種;復(fù)雜數(shù)據(jù)只有一種即 object。
我們先測試一下通過 typeof 來獲取簡單數(shù)據(jù)類型。什么也別說了,上代碼是王道:
// 獲取變量 obj 的數(shù)據(jù)類型
function getType(obj) {
return typeof (obj);
}
/* 常量獲取類型 */
alert(getType(1)); //number
alert(getType("jeff wong")); //string
alert(getType(true)); //boolean
alert(getType(undefined)); //undefined
alert(getType(null)); //object
/* 變量獲取類型 */
var num = 1;
var str = "jeff wong";
var flag = true;
var hell = undefined;
var none = null;
alert(getType(num)); //number
alert(getType(str)); //string
alert(getType(flag)); //boolean
alert(getType(hell)); //undefined
alert(getType(none)); //object
正如你所看到的那樣,通過 typeof 運(yùn)算符,前面四個(gè)簡單數(shù)據(jù)類型完全在意料之中,但是 typeof null 卻返回 object。應(yīng)該注意到,null 是 null 類型的唯一值,但 null 并不是 object,具有 null 值的變量也并非 object,所以直接通過 typeof,并不能正確得到 null 類型。要正確獲取簡單數(shù)據(jù)類型,只要在 getType 的地方加點(diǎn)改進(jìn)就可以了:
function getType(obj) {
return (obj === null) ? "null" : typeof (obj);
}
接著來試一下復(fù)雜數(shù)據(jù)類型 object:
<br>function Cat() { <br>} <br>Cat.prototype.CatchMouse = function () { <br>//do some thing <br>} <br>// 獲取變量 obj 的數(shù)據(jù)類型 function getType(obj) {
return (obj === null) ? "null" : typeof (obj);
}var obj = new Object(); <br>alert(getType(obj)); //object <br>var func = new Function(); <br>alert(getType(func)); //function <br>var str = new String("jeff wong"); <br>alert(getType(str)); //object <br>var num = new Number(10); <br>alert(getType(num)); //object <br>var time = new Date(); <br>alert(getType(time)); //object <br>var arr = new Array(); <br>alert(getType(arr)); //object <br>var reg = new RegExp(); <br>alert(getType(reg)); //object <br>var garfield = new Cat(); <br>alert(getType(garfield)); //object <br>
我們看到,除了 Function(請注意大小寫)返回了 function,不管是 javascript 的常見內(nèi)置對象 Object,String 或者 Date 等等,還是自定義 function,通過 typeof 返回的無一例外,通通都是 object。但是對于自定義 function,我們更愿意得到它的 “廬山真面目”(示例中即 Cat,而非 object),而顯然,typeof 不具備這種轉(zhuǎn)換處理能力。
既然萬能的 typeof 也有無解的時(shí)候,那么我們怎么判斷一個(gè)變量是否是自定義的 function 實(shí)例呢?我們知道,javascript 的所有對象都有一個(gè) constructor 屬性,這個(gè)屬性可以幫我們判斷 object 數(shù)據(jù)類型,尤其是對自定義 function 同樣適用:
var obj = "jeff wong";
alert(obj.constructor == String); //true
obj = new Cat();
alert(obj.constructor == Cat); //true
但是,下面的代碼您也可以測試一下:
//alert(1.constructor); // 數(shù)字常量 出錯 數(shù)字常量無 constructor
var num = 1;
alert(num.constructor == Number); //true
alert("jeff wong".constructor == String); //true
var str = "jeff wong";
alert(str.constructor == String); //true
var obj= null;
alert(obj.constructor); //null 沒有 constructor 屬性
none = undefined;
alert(obj.constructor); //undefined 沒有 constructor 屬性
實(shí)驗(yàn)證明,數(shù)字型常量,null 和 undefined 都沒有 constructor 屬性。
到這里,您會和我一樣慶幸認(rèn)為終于大功告成了嗎?下面的代碼或許還能有點(diǎn)啟發(fā)和挖掘作用:
function Animal() {
}
function Cat() {
}
Cat.prototype = new Animal();
Cat.prototype.CatchMouse = function () {
//do some thing
}
var obj = new Cat();
alert(obj.constructor == Cat); //false ??
alert(obj.constructor == Animal); //true 理解
原來對于原型鏈繼承的情況,constuctor 也不那么好使了。那怎么辦?
嘿嘿,有請 instanceof 隆重登場??此拿?,好像是獲取某一個(gè)對象的實(shí)例,也不知這樣理解對不對?不管怎樣,我們還是動手改進(jìn)上面的代碼測試一下先:
function Animal() {
}
function Cat() {
}
Cat.prototype = new Animal();
Cat.prototype.CatchMouse = function () {
//do some thing
}
var garfield = new Cat();
alert(garfield instanceof Cat); //true 毫無疑問
alert(garfield instanceof Animal); //true 可以理解