數(shù)據(jù)類(lèi)型分為基本類(lèi)型和引用類(lèi)型
基本類(lèi)型:String瓢棒、Number、Boolean丘喻、Null、Undefined念颈、symbol(ES6)
引用類(lèi)型:Object泉粉、Array、Date、Function嗡靡、Error跺撼、RegExp、Math讨彼、Number歉井、String、Boolean哈误、Globle哩至。
js內(nèi)置類(lèi)型有七種:String、Number蜜自、Boolean菩貌、Null、Undefined重荠、Symbol(ES6)箭阶、Object
判斷數(shù)據(jù)類(lèi)型的方法一般可以通過(guò):typeof、instanceof戈鲁、constructor仇参、Object.prototype.toString.call();四種常用方法
1、typeof
- 可以用來(lái)判斷
基本數(shù)據(jù)類(lèi)型(不包括null)
和function
- typeof null // object
typeof 1 // number
typeof 'a' // string
typeof true // boolean
typeof undefined // undefined
typeof Symbol() // symbol
typeof 42n // bigint
typeof function(){} // fucntion
注意:typeof null也是返回object婆殿,這是一個(gè)bug因?yàn)椴煌膶?duì)象在底層都是二進(jìn)制存儲(chǔ)冈敛,js中二進(jìn)制前三位為0的話會(huì)被判斷為object類(lèi)型,而null的二進(jìn)制都是0鸣皂,造成誤判抓谴。
2、instanceof(判斷是否是某個(gè)類(lèi)的實(shí)例)
判斷對(duì)象和構(gòu)造函數(shù)在原型鏈上是否有關(guān)系寞缝,如果有關(guān)系癌压,返回真,否則返回假
console.log(bool instanceof Boolean); // false
console.log(num instanceof Number); // false
console.log(str instanceof String); // false
console.log(undefined instanceof Object); // false
console.log(null instanceof Object); // false
console.log(arr instanceof Array); // true
console.log(obj instanceof Object); // true
console.log(fun instanceof Function); // true
console.log(s1 instanceof Symbol); // false
3荆陆、constructor(查看對(duì)象對(duì)應(yīng)的構(gòu)造函數(shù))
console.log(bool.constructor === Boolean); // true
console.log(num.constructor === Number); // true
console.log(str.constructor === String); // true
console.log(arr.constructor === Array); // true
console.log(obj.constructor === Object); // true
console.log(fun.constructor === Function); // true
console.log(s1.constructor === Symbol); // true
- null和undefined沒(méi)有相應(yīng)的構(gòu)造形式滩届,而Date,只有相應(yīng)的構(gòu)造形式而沒(méi)有文字形式兩者相反**
4被啼、Object.prototype.toString(通用方法)
Object.prototype.toString.call(999) // [object Number]
Object.prototype.toString.call('') // [object String]
Object.prototype.toString.call(Symbol()) // [object Symbol]
Object.prototype.toString.call(42n) // [object BigInt]
Object.prototype.toString.call(null) // [object Null]
Object.prototype.toString.call(undefined) // [object Undefined]
Object.prototype.toString.call(true) // [object Boolean]
Object.prototype.toString.call({a:1}) // [object Object]
Object.prototype.toString.call([1,2]) // [object Array]
Object.prototype.toString.call(new Date) // [object Date]
Object.prototype.toString.call(function(){}) // [object Function]
- 簡(jiǎn)單原理為:子類(lèi)型在內(nèi)部借用了object中的tostring()方法
- toString是Object原型對(duì)象上的一個(gè)方法帜消,該方法默認(rèn)返回其調(diào)用者的具體類(lèi)型,更嚴(yán)格的講浓体,是 toString運(yùn)行時(shí)this指向的對(duì)象類(lèi)型, 返回的類(lèi)型
從這個(gè)結(jié)果也可以看出泡挺,不管是什么類(lèi)型的,Object.prototype.toString.call();都可以判斷出其具體的類(lèi)型命浴。
接下來(lái)我們分析一下四種方法各自的優(yōu)缺點(diǎn)