1、typeof :用來檢測數(shù)據(jù)類型的運(yùn)算符
使用typeof檢測數(shù)據(jù)類型,首先返回的都是一個字符串,其次字符串中包含了對應(yīng)的數(shù)據(jù)類型
例如:"number"、"string"、"boolean"、"undefined"、"function"、"object"
eg:console.log(typeof typeof typeof function(){}) ---->"string"
局限性:
a、typeof null--->"object"
b、不能具體的細(xì)分是數(shù)組還是正則,還是對象中其他的值。因為使用typeof檢測數(shù)據(jù)類型,對于對象數(shù)據(jù)類型中的左右的值,最后返回的結(jié)果都是"object"
2、instanceof:檢測某一個實(shí)例是否屬于某個類
可以彌補(bǔ)typeof的局限性
console.log(obj instanceof Array);
console.log(obj instanceof RegExp);
局限性(好多):
a、不能用來檢測和處理字面量方式創(chuàng)建出來的基本數(shù)據(jù)類型值
對于基本數(shù)據(jù)類型來說,字面量方式創(chuàng)建出來的結(jié)果和實(shí)例方式創(chuàng)建出來的結(jié)果是有一定區(qū)別的。從嚴(yán)格意義上來講,只有實(shí)例創(chuàng)建出來的結(jié)果才是標(biāo)準(zhǔn)的對象數(shù)據(jù)類型值,也是標(biāo)準(zhǔn)的Number這個類的一個實(shí)例;對于字面量方式創(chuàng)建出來的結(jié)果是基本的數(shù)據(jù)類型值,不是嚴(yán)謹(jǐn)?shù)膶?shí)例。但由于JS的松散特點(diǎn),導(dǎo)致了可以使用Number.prototype上提供的方法
console.log(1 instanceof Number); //---->false
console.log(new Number (1) instanceof Number); //---->true
b、instanceof特性:只要在當(dāng)前實(shí)例的原型鏈上,用其檢測出來的結(jié)果都是true
eg:
var ary=[];
console.log(ary instanceof Array); //--->true
console.log(ary instanceof Object); //---->true
在類的原型繼承中,最后檢測出來的結(jié)果未必準(zhǔn)確
3、constructor:構(gòu)造函數(shù)(一般不用)
作用和instanceof非常的相似,也能具體檢測出是正則還是數(shù)組等。
a、constructor可以處理基本數(shù)據(jù)類型的檢測
console.log((1).constructor===Number); //-->true
b、constructor檢測Object和instanceof不一樣,一般情況下是檢測不了的
var reg=/^$/;
console.log(reg.constructor===RegExp); //--->true
console.log(reg.constructor===Object); //--->false
局限性:
可以把類的原型進(jìn)行重寫,在重寫的過程中很有可能出現(xiàn)把之前的constructor給覆蓋了,這樣檢測出來的結(jié)果是不準(zhǔn)確的
function Fn(){};
Fn.prototype=new Array;
var f=new Fn;
console.log(f.constructor); //--->Array,但是f并不是數(shù)組,所以用constructor檢測也是不準(zhǔn)確的
對于特殊的數(shù)據(jù)類型null和undefined,它們的所屬類是Null和Undefined,但瀏覽器把這兩個類保護(hù)起來了,不允許在外面訪問使用
4、Object.prototype.toString.call()(最準(zhǔn)確最常用的方式)
首先獲取Object原型上的toString方法,讓方法執(zhí)行,并且改變方法中的this關(guān)鍵字的指向
Object.prototype.toString它的作用是返回當(dāng)前方法的執(zhí)行主體(方法中this)所屬類的詳細(xì)信息
var onj={name:"haha"};
console.log(obj.toString()); //--->"[object Object]
toString中的this是obj,返回的是obj所屬類的信息;"[object Object]":第一個object代表當(dāng)前實(shí)例是對象數(shù)據(jù)類型的(這個是固定死的),第二個object代表的是obj所屬的類是Object
Math.toString():toString中的this是Math,那么返回的是Math所屬類的信息--->"[object Math]"
toString的理解:
乍一看應(yīng)該是轉(zhuǎn)換為字符串,但某一些toString方法不僅僅是轉(zhuǎn)換為字符串
對于Number、String、Boolean、Array、RegExp、Dtae、Function原型上的toString方法都是把當(dāng)前的數(shù)據(jù)類型轉(zhuǎn)換為字符串的類型(它們的作用僅僅是用來轉(zhuǎn)換為字符串的)
Object.prototype.toString并不是用來轉(zhuǎn)換為字符串的
({name:"haha"}).toString(); //--->"[object Object]
Math.toString(); //---->"[object Math]"