鍍金池/ 教程/ HTML/ 淺談 javascript 的數(shù)據(jù)類型檢測(cè)
淺談 JavaScript 之事件綁定
淺談 javascript 中字符串 String 與數(shù)組 Array
淺談 javascript 中基本包裝類型
淺談 JavaScript Math 和 Number 對(duì)象
淺談 Javascript 的靜態(tài)屬性和原型屬性
淺談 JavaScript 中定義變量時(shí)有無(wú) var 聲明的區(qū)別
淺談 JavaScript Array 對(duì)象
淺談 JavaScript 函數(shù)參數(shù)的可修改性問(wèn)題
淺談 javascript 中的 instanceof 和 typeof
淺談 JavaScript 中 Date (日期對(duì)象),Math 對(duì)象
淺談 Javascript 執(zhí)行順序
淺談 javascript 函數(shù)屬性和方法
淺談 JavaScript 中面向?qū)ο蠹夹g(shù)的模擬
淺談 javascript 的原型繼承
淺談 javascript 事件取消和阻止冒泡
根據(jù)一段代碼淺談 Javascript 閉包
淺談 Javascript 面向?qū)ο缶幊?/span>
淺談 javascript 六種數(shù)據(jù)類型以及特殊注意點(diǎn)
淺談 Javascript 變量作用域問(wèn)題
淺談 javascript 函數(shù)內(nèi)部屬性
淺談 javascript 中自定義模版
淺談 JavaScript 字符集
淺談 javascript 面向?qū)ο缶幊?/span>
淺談 JavaScript 框架分類
淺談 JavaScript 中的 Math.atan() 方法的使用
淺談 Javascript 數(shù)組與字典
淺談 JavaScript 數(shù)據(jù)類型及轉(zhuǎn)換
淺談 javascript 的調(diào)試
淺談 Javascript 嵌套函數(shù)及閉包
淺談 javascript 回調(diào)函數(shù)
淺談 JavaScript Date 日期和時(shí)間對(duì)象
淺談 Javascript 中的 Function 與 Object
淺談 JavaScript 數(shù)據(jù)類型
淺談 javascript 中 this 在事件中的應(yīng)用
淺談 javascript 中的閉包
淺談 javascript 函數(shù)劫持
淺談 Javascript 中深復(fù)制
淺談 JavaScript 函數(shù)節(jié)流
淺談 JavaScript 中的 String 對(duì)象常用方法
淺談 JavaScript 事件的屬性列表
淺談 JavaScript 函數(shù)與棧
淺談 JavaScript 的事件
淺談 javascript 中的作用域
淺談 JavaScript 的執(zhí)行效率
淺談 Javascript 事件模擬
淺談 JavaScript function 函數(shù)種類
淺談 javascript 歸并方法
淺談 javascript 迭代方法
淺談 JavaScript 編程語(yǔ)言的編碼規(guī)范
淺談 JavaScript 實(shí)現(xiàn)面向?qū)ο笾械念?/span>
淺談 Javascript 鼠標(biāo)和滾輪事件
淺談 Javascript Base64 加密解密
淺談 Javascript 中勻速運(yùn)動(dòng)的停止條件
淺談 javascript 實(shí)現(xiàn)八大排序
淺談 javascript 的分號(hào)的使用
淺談 javascript 中 createElement 事件
淺談 javascript 的數(shù)據(jù)類型檢測(cè)
淺談 javascript 對(duì)象模型和 function 對(duì)象
淺談 Javascript 如何實(shí)現(xiàn)勻速運(yùn)動(dòng)
淺談 JavaScript 字符串與數(shù)組
淺談 javascript 面向?qū)ο蟪绦蛟O(shè)計(jì)
淺談 Javascript 事件處理程序的幾種方式

淺談 javascript 的數(shù)據(jù)類型檢測(cè)

javascript 的數(shù)據(jù)

javascript 的數(shù)據(jù)分為兩種:簡(jiǎn)單數(shù)據(jù)和復(fù)雜數(shù)據(jù)。簡(jiǎn)單數(shù)據(jù)包含 number,string,boolean,undefined 和 null 這五種;復(fù)雜數(shù)據(jù)只有一種即 object。

javascript 的數(shù)據(jù)類型檢測(cè)

萬(wàn)能的 typeof

我們先測(cè)試一下通過(guò) typeof 來(lái)獲取簡(jiǎn)單數(shù)據(jù)類型。什么也別說(shuō)了,上代碼是王道:

// 獲取變量 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  

正如你所看到的那樣,通過(guò) typeof 運(yùn)算符,前面四個(gè)簡(jiǎn)單數(shù)據(jù)類型完全在意料之中,但是 typeof null 卻返回 object。應(yīng)該注意到,null 是 null 類型的唯一值,但 null 并不是 object,具有 null 值的變量也并非 object,所以直接通過(guò) typeof,并不能正確得到 null 類型。要正確獲取簡(jiǎn)單數(shù)據(jù)類型,只要在 getType 的地方加點(diǎn)改進(jìn)就可以了:

function getType(obj) {   
return (obj === null) ? "null" : typeof (obj);   
}  

接著來(lái)試一下復(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(請(qǐng)注意大小寫)返回了 function,不管是 javascript 的常見(jiàn)內(nèi)置對(duì)象 Object,String 或者 Date 等等,還是自定義 function,通過(guò) typeof 返回的無(wú)一例外,通通都是 object。但是對(duì)于自定義 function,我們更愿意得到它的 “廬山真面目”(示例中即 Cat,而非 object),而顯然,typeof 不具備這種轉(zhuǎn)換處理能力。

constructor,想大聲說(shuō)愛(ài)你

既然萬(wàn)能的 typeof 也有無(wú)解的時(shí)候,那么我們?cè)趺磁袛嘁粋€(gè)變量是否是自定義的 function 實(shí)例呢?我們知道,javascript 的所有對(duì)象都有一個(gè) constructor 屬性,這個(gè)屬性可以幫我們判斷 object 數(shù)據(jù)類型,尤其是對(duì)自定義 function 同樣適用:

var obj = "jeff wong";   
alert(obj.constructor == String); //true   
obj = new Cat();   
alert(obj.constructor == Cat); //true  

但是,下面的代碼您也可以測(cè)試一下:

//alert(1.constructor); // 數(shù)字常量 出錯(cuò) 數(shù)字常量無(wú) 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 沒(méi)有 constructor 屬性   
none = undefined;   
alert(obj.constructor); //undefined 沒(méi)有 constructor 屬性  

實(shí)驗(yàn)證明,數(shù)字型常量,null 和 undefined 都沒(méi)有 constructor 屬性。

到這里,您會(huì)和我一樣慶幸認(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 理解  

原來(lái)對(duì)于原型鏈繼承的情況,constuctor 也不那么好使了。那怎么辦?

直觀的 instanceof

嘿嘿,有請(qǐng) instanceof 隆重登場(chǎng)??此拿?,好像是獲取某一個(gè)對(duì)象的實(shí)例,也不知這樣理解對(duì)不對(duì)?不管怎樣,我們還是動(dòng)手改進(jìn)上面的代碼測(cè)試一下先:

function Animal() {   
}   
function Cat() {   
}   
Cat.prototype = new Animal();   
Cat.prototype.CatchMouse = function () {   
//do some thing   
}   
var garfield = new Cat();   
alert(garfield instanceof Cat); //true 毫無(wú)疑問(wèn)   
alert(garfield instanceof Animal); //true 可以理解