分類(lèi)
ECMAScript 規(guī)范中,共定義了 9 種數(shù)據(jù)類(lèi)型,分為 基本類(lèi)型 和 引用類(lèi)型 兩大類(lèi),如下所示:
值類(lèi)型(基本類(lèi)型):字符串(String)、數(shù)字(Number)、布爾(Boolean)、對(duì)空(Null)、未定義(Undefined)、Symbol(ES6新增) BigInt(ES2020新增)。
引用數(shù)據(jù)類(lèi)型:對(duì)象(Object)、函數(shù)(Function)。
注:在web文檔中將函數(shù)(Function)歸為一類(lèi)引用類(lèi)型,Object的子對(duì)象(如:數(shù)組[Array]、時(shí)間對(duì)象[Date]等)歸類(lèi)于對(duì)象(Object)
注:Number 指-253到253之間的數(shù),超過(guò)這個(gè)范圍,無(wú)法精確表示這個(gè)整數(shù)(丟失精度)。NaN
注:BigInt 可以表示任意大的整數(shù),可以用在一個(gè)整數(shù)字面量后面加n 的方式定義一個(gè)BigInt, 當(dāng)一個(gè)數(shù)大于Number的范圍時(shí)可用BigInt 表示
注:NaN 屬性是代表非數(shù)字值的特殊值。該屬性用于指示某個(gè)值不是數(shù)字,NaN 與所有值都不相等,包括它自己。
console.log(typeof NaN); // 輸出 number
console.log(NaN == NaN); // 輸出 false
判斷
使用typeof判斷基本類(lèi)型數(shù)據(jù)
typeof返回一個(gè)表示數(shù)據(jù)類(lèi)型的字符串,返回結(jié)果包括:number、string、boolean、object、undefined、function 、symbol 、bigint。typeof可以對(duì)基本類(lèi)型number、string 、boolean、undefined、symbol 、bigint做出準(zhǔn)確的判斷(null除外),而對(duì)于引用類(lèi)型,除了function之外返回的都是object。但當(dāng)我們需要知道某個(gè)對(duì)象的具體類(lèi)型時(shí),typeof就顯得有些力不從心了。
console.log(typeof undefined); // 輸出 undefined
console.log(typeof null); // 輸出 object
console.log(typeof false); // 輸出 boolean
console.log(typeof ''); // 輸出 string
console.log(typeof 1); // 輸出 number
console.log(typeof 1n) //輸出 bigint
console.log(typeof Symbol('1')) //輸出 symbol
console.log(typeof function () {}); // 輸出 function
console.log(typeof {}) //輸出 object
console.log(typeof new Date()) //輸出 object 無(wú)法輸出具體對(duì)象類(lèi)型Date
console.log(typeof new RegExp()) //輸出 object 無(wú)法輸出具體對(duì)象類(lèi)型RegExp
使用instanceof確定數(shù)據(jù)的具體類(lèi)型
當(dāng)我們認(rèn)為一個(gè)對(duì)象可能是某個(gè)具體類(lèi)型時(shí),當(dāng)又無(wú)法確定時(shí)可以使用運(yùn)算符 instanceof,instanceof操作符判斷左操作數(shù)對(duì)象的原型鏈上是否有右邊這個(gè)構(gòu)造函數(shù)的prototype屬性,也就是說(shuō)指定對(duì)象是否是某個(gè)構(gòu)造函數(shù)的實(shí)例,最后返回布爾值。
[] instanceof Array; //true
[] instanceof Object; //true
new Date() instanceof Date;//true
new Date() instanceof Object;//true
function Person(){};
new Person() instanceof Person;//true
new Person() instanceof Object;//true
我們發(fā)現(xiàn),雖然 instanceof 能夠判斷出 [] 是Array的實(shí)例,但它認(rèn)為 [] 也是Object的實(shí)例,為什么呢? 我們來(lái)分析一下[]、Array、Object 三者之間的關(guān)系: 從instanceof 能夠判斷出 [].proto 指向 Array.prototype, 而 Array.prototype.proto 又指向了Object.prototype,Object.prototype.proto 指向了null,標(biāo)志著原型鏈的結(jié)束。因此,[]、Array、Object就形成了如下圖所示的一條原型鏈:
從原型鏈可以看出,[] 的 proto 直接指向Array.prototype, 間接指向Object.prototype, 所以按照 instanceof 的判斷規(guī)則,[] 就是Object的實(shí)例。
注意:instanceof運(yùn)算符只能用于對(duì)象,不適用原始類(lèi)型的值。
使用Object.prototype.toString判斷具體類(lèi)型
toString是Object原型對(duì)象上的一個(gè)方法,該方法默認(rèn)返回其調(diào)用者的具體類(lèi)型,更嚴(yán)格的講,是 toString運(yùn)行時(shí)this指向的對(duì)象類(lèi)型, 返回的類(lèi)型格式為[object,xxx],xxx是具體的數(shù)據(jù)類(lèi)型,其中包括:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有對(duì)象的類(lèi)型都可以通過(guò)這個(gè)方法獲取到。
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object Window]
相關(guān)資料
JavaScript 數(shù)據(jù)類(lèi)型和數(shù)據(jù)結(jié)構(gòu)
typeof
instanceof
JS數(shù)據(jù)類(lèi)型分類(lèi)和判斷