JS 中有四種方式判斷數(shù)據(jù)類型瑟蜈,它們分別是:typeof
、instanceof
姐帚、constructor
吏垮、Object.prototype.toString
。
在 ES5 中,新增了幾種方式可以用來(lái)進(jìn)行數(shù)組的判斷膳汪,它們是 Object.prototype.isPrototypeOf
唯蝶、 Array.isArray
和 Object.getPrototypeOf
。
typeof 操作符
typeof 操作符返回一個(gè)字符串遗嗽,表示未經(jīng)計(jì)算的操作數(shù)的類型
很遺憾粘我,對(duì)于任何引用類型的數(shù)據(jù)(包括 null
),typeof
統(tǒng)一返回 Object
字符串媳谁,所以不能用它來(lái)判斷 JS 中的數(shù)組涂滴。
instanceof 操作符
instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上友酱。
于是可以通過(guò) instanceof 檢測(cè)數(shù)據(jù)的原型鏈中是否存在 Array 構(gòu)造函數(shù)來(lái)判斷數(shù)據(jù)是否是數(shù)組晴音。
var arr = [];
arr instanceof Array; // true
constructor 屬性
對(duì)象實(shí)例有一個(gè) constructor
屬性,constructor
指向?qū)ο髮?shí)例的構(gòu)造函數(shù)缔杉。于是锤躁,我們可以通過(guò)判斷數(shù)據(jù)的 constructor
是否為 Array
構(gòu)造函數(shù)即可。
var arr = [];
arr.constructor === Array; // true
要注意:constructor
是可以被修改的或详,所以這種判斷方式不可靠系羞。
Object.prototype.toString 方法
toString
可以用于檢測(cè)對(duì)象的類型,它返回一個(gè)字符串霸琴。為了每個(gè)對(duì)象都能通過(guò) Object.prototype.toString
來(lái)判斷椒振,需要借助函數(shù)的 call
或者 apply
方法。
var arr = [];
Object.prototype.toString.call(arr); // [Object Array]
Array.isArray 方法
這個(gè)方法沒(méi)什么好說(shuō)的梧乘,直接調(diào)用即可澎迎,會(huì)返回一個(gè)布爾值。
Object.getPrototypeOf 方法
Object.getPrototypeOf 方法返回指定對(duì)象的原型的值选调。
根據(jù) ES5 新增的這個(gè)方法夹供,我們可以把數(shù)組的原型對(duì)象與需要判斷對(duì)象的原型進(jìn)行比較,如果兩者是全等關(guān)系仁堪,那么可以認(rèn)為它是數(shù)組哮洽。
var arr = [];
Object.getPrototypeOf(arr) === Array.prototype; // true
Object.prototype.isPrototypeOf 方法
isPrototypeOf 方法用于測(cè)試一個(gè)對(duì)象是否存在于另一個(gè)對(duì)象的原型鏈上。
借用 ES5 新增的 isPrototypeOf
方法弦聂,可以直接了當(dāng)?shù)耐ㄟ^(guò) Array
調(diào)用來(lái)判斷目標(biāo)數(shù)據(jù)是否是數(shù)組類型鸟辅。
var arr = [];
Array.prototype.isPrototypeOf(arr); // true
寫在最后
ES5 新增的兩種方法都與原型鏈有關(guān),理解并掌握原型相關(guān)內(nèi)容還是判斷數(shù)組的關(guān)鍵莺葫。方便理解與記憶的話剔桨,可以把 isArray
和 isPrototypeOf
放在一起,他們返回的都是布爾值徙融,并且用途也相似洒缀。
getPrototypeOf
方法則是用來(lái)找到被檢測(cè)數(shù)據(jù)的原型,拿到原型后還要與 Array.prototype
進(jìn)行比較。