JavaScript 類型檢測(cè)
本文介紹JavaScript的幾種類型檢測(cè)的方法,以及其各自的適用范圍。
JavaScript 的數(shù)據(jù)類型
JavaScript中的數(shù)據(jù)類型有null、undefined、布爾值、字符串、數(shù)字、對(duì)象,這6種數(shù)據(jù)類型,其中前五種是基本數(shù)據(jù)類型,對(duì)象是復(fù)雜數(shù)據(jù)類型。
JavaScript中檢測(cè)類型有如下幾種方法:
typeofinstanceofconstructor-
duck type(鴨子類型)
typeof
typeof返回字符串,適用于函數(shù)對(duì)象和基本類型的檢測(cè)(注:遇null失效),各種類型的返回值如下:
| 代碼 | 結(jié)果 |
|---|---|
typeof 1 |
"number" |
typeof true |
"boolean" |
typeof function |
"function" |
typeof [3,4,5] |
"object" |
typeof new Object() |
"object" |
typeof NaN |
"number" |
typeof undefined |
"undefined" |
typeof null |
"object"(null被認(rèn)為是一個(gè)空的對(duì)象引用) |
不適用的范圍:
-
typeof null返回"object",所以不適合判斷null
如需判斷某個(gè)對(duì)象是否是null,可以使用obj === null
instanceof
instanceof 是一個(gè)二元操作符,左邊是要判斷的對(duì)象,右面是函數(shù)對(duì)象或者構(gòu)造器
instanceof 是基于原型鏈進(jìn)行判斷,判斷左邊的原型鏈上是否有右邊的類型(和Java的intanceof類型)
function Dog() {}
// Dog繼承于Animal
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
var dog = new Dog();
console.log(dog instanceof Dog); // true dog直接用Dog初始化,所以為真
var cat = new Animal();
console.log(cat instanceof Animal); // true cat直接用Animal初始化,所以為真
console.log(cat instanceof Dog); //false
console.log(dog instanceof Animal); //true
在判斷dog是否是Animal類型時(shí),dog對(duì)象有一個(gè)原型_proto_,該原型會(huì)指向其構(gòu)造器 Dog 的_proto_,但是Animal不等于Dog,所以該原型鏈會(huì)繼續(xù)向上查找,Dog的_proto_指向了Animal,所以最終dog instanceof Animal 返回true
不適用的范圍:在多窗口和多框架的子頁(yè)面的web應(yīng)用中兼容性不好。
原因:在兩個(gè)不同框架頁(yè)面創(chuàng)建的兩個(gè)相同的對(duì)象繼承與兩個(gè)相同但互相獨(dú)立的原型對(duì)象(例如:創(chuàng)建兩個(gè)數(shù)組),其中一個(gè)框架頁(yè)面中的數(shù)組不是另一個(gè)框架頁(yè)面中的Array()構(gòu)造函數(shù)的實(shí)例,instanceof 運(yùn)算結(jié)果返回false。
constructor
不適用范圍:
- 不適合判斷null和undefined,因?yàn)闆](méi)有contructor屬性
- contructor可能被改寫
- 和instanceof類型,在多窗口和多框架下無(wú)法工作
- 并非所有的對(duì)象都包含contructor 屬性
contructor的使用如下:
| 代碼 | 結(jié)果 |
|---|---|
var x=1; x.constructor |
Number |
var x=true; x.constructor |
Boolean |
var x = function(){};x.constructor |
Function |
var x='string';x.constructor |
String |
注意:null和undefined沒(méi)有constructor
duck type
不要關(guān)注對(duì)象的類是什么,而是關(guān)注對(duì)象能做什么。
例如,我們?cè)谂袛嘁粋€(gè)對(duì)象是否是Array的實(shí)例的時(shí)候,可以通過(guò)判斷對(duì)象是否含有一個(gè)非負(fù)的length屬性來(lái)判斷,這是一個(gè)必要非充分條件。