13、JS判斷數(shù)據(jù)類型的4種方法

JS分為基本類型和引用類型兩大類;
基本類型:Number,String,Boolean,Undefined,Null,Symbol
引用類型:Object,Date,Function,Array,RegExp

檢測數(shù)據(jù)類型的方法
1、typeof

typeof 1  // "number"
typeof ''  // string
typeof true  //boolean
typeof undefined  //undefined
typeof Symbol() // symbol

typeof null //object

typeof new Date() //object
typeof new RegExp() //object
typeof []  //object
typeof {} //object
function fun(){}   
typeof fun  // function

typeof 對于基本類型中Number,String,Boolean,Undefined,Symbol和引用類型的Function可以檢測出具體的數(shù)據(jù)類型,但是對于 Null,Array,Date,Object,RegExp統(tǒng)一識別成object
2、instanceof
instanceof 是用來判斷 A 是否為 B 的實例,表達式為:A instanceof B,如果 A 是 B 的實例,則返回 true,否則返回 false。

newDate() instanceof Date;// true
new RegExp()  instanceof RegExp  // true
[] instanceof Array // true
{} instanceof Object // true

[] instanceof Object;// true

3、toString
toString() 是 Object 的原型方法,調(diào)用該方法,默認返回當前對象的 [[Class]] 。這是一個內(nèi)部屬性,其格式為 [object Xxx] ,其中 Xxx 就是對象的類型。

對于 Object 對象,直接調(diào)用 toString() 就能返回 [object Object] 。而對于其他對象,則需要通過 call / apply 來調(diào)用才能返回正確的類型信息。

Object.prototype.toString.call('') ;  // [object String]
Object.prototype.toString.call(1) ;   // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(newFunction()) ; // [object Function]
Object.prototype.toString.call(newDate()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(newRegExp()) ; // [object RegExp]
Object.prototype.toString.call(newError()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局對象 global 的引用

4、constructor

當一個函數(shù) Fun被定義時,JS引擎會為Fun添加 prototype 原型,然后再在 prototype上添加一個 constructor 屬性,并讓其指向 Fun 的引用。如下所示:
截屏2021-06-17 上午9.55.39.png

當執(zhí)行 var f = new Fun() 時,F(xiàn)un被當成了構(gòu)造函數(shù),f 是Fun的實例對象,此時 Fun 原型上的 constructor 傳遞到了 f 上,因此 f.constructor == Fun
截屏2021-06-17 上午9.57.08.png

可以看出,F(xiàn)un 利用原型對象上的 constructor 引用了自身,當 Fun 作為構(gòu)造函數(shù)來創(chuàng)建對象時,原型上的 constructor 就被遺傳到了新創(chuàng)建的對象上, 從原型鏈角度講,構(gòu)造函數(shù) Fun就是新對象的類型。這樣做的意義是,讓新對象在誕生以后,就具有可追溯的數(shù)據(jù)類型。

同樣,JavaScript 中的內(nèi)置對象在內(nèi)部構(gòu)建時也是這樣做的:


截屏2021-06-17 上午10.32.23.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容