如何判斷js中的類型呢,先舉幾個例子:
var a = "json";
var b = 123;
var c = true;
var d = [1,2,3];
var e = new Date();
var f = function(){
alert('jason');
};
一虑凛、最常見的判斷方法:typeof
typeof是一個一元運(yùn)算符碑宴,它返回的結(jié)果始終是一個字符串,對不同的操作數(shù)桑谍,它返回不同的結(jié)果延柠,另外typeof可以判斷function的類型;在判斷除Object類型的對象時比較方便锣披。
console.log(typeof a == "string"); //true
console.log(typeof a == String); //false
具體的規(guī)則如下:
- 對于數(shù)字類型的操作數(shù)而言贞间, typeof 返回的值是 number。比如說:typeof 1雹仿,返回的值就是number增热。
上面是舉的常規(guī)數(shù)字,對于非常規(guī)的數(shù)字類型而言胧辽,其結(jié)果返回的也是number峻仇。比如typeof NaN,NaN在JavaScript中代表的是特殊非數(shù)字值邑商,雖然它本身是一個數(shù)字類型摄咆。
在JavaScript中凡蚜,特殊的數(shù)字類型還有幾種:
Infinity //表示無窮大特殊值
NaN //特殊的非數(shù)字值
Number.MAX_VALUE //可表示的最大數(shù)字
Number.MIN_VALUE //可表示的最小數(shù)字(與零最接近)
Number.NaN //特殊的非數(shù)字值
Number.POSITIVE_INFINITY //表示正無窮大的特殊值
Number.NEGATIVE_INFINITY //表示負(fù)無窮大的特殊值
以上特殊類型,在用typeof進(jìn)行運(yùn)算進(jìn)吭从,其結(jié)果都將是number朝蜘。
- 對于字符串類型,typeof返回的值是string影锈。比如typeof "jason"返回的值是string芹务。
- 對于布爾類型,typeof返回的值是boolean鸭廷。比如typeof true返回的值是boolean枣抱。
- 對于對象、數(shù)組辆床、null返回的值是object佳晶。比如typeof {},typeof []讼载,typeof null返回的值都是object轿秧。
- 對于函數(shù)類型,返回的值是function咨堤。比如:typeof eval菇篡,typeof Date返回的值都是function。
- 如果運(yùn)算數(shù)是沒有定義的(比如說不存在的變量一喘、函數(shù)或者undefined)驱还,將返回undefined。比如:typeof undefined都返回undefined凸克。
console.log(typeof a); //string
console.log(typeof b); //number
console.log(typeof c); //boolean
console.log(typeof d); //object
console.log(typeof e); //object
console.log(typeof f); //function
console.log(typeof 1); //number
console.log(typeof NaN); //number
console.log(typeof Number.MIN_VALUE); //number
console.log(typeof Infinity); //number
console.log(typeof "123"); //string
console.log(typeof true); //boolean
console.log(typeof {}); //object
console.log(typeof []); //object
console.log(typeof null); //object
console.log(typeof eval); //function
console.log(typeof Date); //function
console.log(typeof undefined); //undefined
二议蟆、判斷一個對象是否為某一數(shù)據(jù)類型,或一個變量是否為一個對象的實例:instanceof
注意:1)instanceof 后面一定要是對象類型萎战,并且大小寫不能錯咐容,該方法適合一些條件選擇或分支。
2)instanceof 運(yùn)算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性蚂维。
語法:object instanceof constructor
參數(shù):object(要檢測的對象.)constructor(某個構(gòu)造函數(shù))
描述:instanceof 運(yùn)算符用來檢測 constructor.prototype 是否存在于參數(shù) object 的原型鏈上戳粒。
console.log(d instanceof Array); //true
console.log(e instanceof Date); //true
console.log(f instanceof Function); //true
如果你想檢測對象的原型鏈上是否存在某個特定的原型對象,有沒有不適用構(gòu)造函數(shù)作為中介的方法呢虫啥?可以用isPrototypeOf() 方法
作用:檢測一個對象是否是另一個對象的原型享郊。或者說一個對象是否被包含在另一個對象的原型鏈中
例如:
var p = {x:1};//定義一個原型對象
var o = Object.create(p);//使用這個原型創(chuàng)建一個對象
p.isPrototypeOf(o);//=>true:o繼承p
Object.prototype.isPrototypeOf(p);//=> true p繼承自O(shè)bject.prototype
function Animal(){
this.species = "動物";
};
var eh = new Animal();
Animal.prototype.isPrototypeOf(eh)//=>true
三孝鹊、根據(jù)對象的constructor判斷:constructor
console.log(d.constructor === Array) //true
console.log(e.constructor === Date) //true
console.log(f.constructor === Function) //true
注意constructor在類繼承時會出錯
例如:
function A(){};
function B(){};
var aObj = new A();
console.log(aObj.constructor === A); //true;
console.log(aObj.constructor === B); //false;
function C(){};
function D(){};
C.prototype = new D(); //C繼承自D
var cObj = new C();
console.log(cObj.constructor === C); //false;
console.log(cObj.constructor === D); //true;
而instanceof方法不會出現(xiàn)該問題,對象直接繼承和間接繼承的都會報true:
console.log(cObj instanceof C); //true
console.log(cObj instanceof D); //true
解決construtor的問題通常是讓對象的constructor手動指向自己:
cObj.constructor = C; //將自己的類賦值給對象的constructor屬性
console.log(cObj.constructor === C); //true;
console.log(cObj.constructor === D); //false; 基類不會報true了;
四展蒂、通用但很繁瑣的方法:prototype
console.log(Object.prototype.toString.call(a) === '[object String]'); //true
console.log(Object.prototype.toString.call(b) === '[object Number]'); //true
console.log(Object.prototype.toString.call(c) === '[object Boolean]'); //true
console.log(Object.prototype.toString.call(d) === '[object Array]'); //true
console.log(Object.prototype.toString.call(e) === '[object Date]'); //true
console.log(Object.prototype.toString.call(f) === '[object Function]'); //true