JavaScript 類型檢測
本文介紹JavaScript的幾種類型檢測的方法,以及其各自的適用范圍亿胸。
JavaScript 的數(shù)據(jù)類型
JavaScript中的數(shù)據(jù)類型有null
冕广、undefined
、布爾值、字符串慧妄、數(shù)字、對象纫溃,這6種數(shù)據(jù)類型腰涧,其中前五種是基本數(shù)據(jù)類型,對象是復(fù)雜數(shù)據(jù)類型紊浩。
JavaScript中檢測類型有如下幾種方法:
typeof
instanceof
constructor
-
duck type
(鴨子類型)
typeof
typeof
返回字符串窖铡,適用于函數(shù)對象和基本類型的檢測(注:遇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 被認為是一個空的對象引用) |
不適用的范圍:
-
typeof null
返回"object"坊谁,所以不適合判斷null
如需判斷某個對象是否是null
费彼,可以使用obj === null
instanceof
instanceof 是一個二元操作符,左邊是要判斷的對象口芍,右面是函數(shù)對象或者構(gòu)造器
instanceof 是基于原型鏈進行判斷箍铲,判斷左邊的原型鏈上是否有右邊的類型(和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類型時颠猴,dog對象有一個原型_proto_
,該原型會指向其構(gòu)造器 Dog 的_proto_
小染,但是Animal不等于Dog翘瓮,所以該原型鏈會繼續(xù)向上查找,Dog的_proto_
指向了Animal裤翩,所以最終dog instanceof Animal
返回true
不適用的范圍:在多窗口和多框架的子頁面的web應(yīng)用中兼容性不好资盅。
原因:在兩個不同框架頁面創(chuàng)建的兩個相同的對象繼承與兩個相同但互相獨立的原型對象(例如:創(chuàng)建兩個數(shù)組),其中一個框架頁面中的數(shù)組不是另一個框架頁面中的Array()構(gòu)造函數(shù)的實例,instanceof 運算結(jié)果返回false呵扛。
constructor
不適用范圍:
- 不適合判斷null和undefined每庆,因為沒有contructor屬性
- contructor可能被改寫
- 和instanceof類型,在多窗口和多框架下無法工作
- 并非所有的對象都包含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
沒有constructor
duck type
不要關(guān)注對象的類是什么今穿,而是關(guān)注對象能做什么缤灵。
例如,我們在判斷一個對象是否是Array的實例的時候荣赶,可以通過判斷對象是否含有一個非負的length屬性來判斷凤价,這是一個必要非充分條件。