1.instanceof
- 使用方法:
arr instanceof Array //return true or false
- instanceof的原理是檢查原型鏈,所以只能用于對(duì)象,不能用于基本類型。但對(duì)基本包裝類型(Number、Boolean、String類型),因?yàn)槠浔举|(zhì)是引用類型,故能夠用instanceof來判斷。
- 缺點(diǎn):instanceof假定只有一個(gè)全局環(huán)境,如果網(wǎng)頁(yè)中包含多個(gè)框架,那實(shí)際上就存在多個(gè)不同的全局執(zhí)行環(huán)境,從而存在兩個(gè)以上不同版本的Array構(gòu)造函數(shù)。如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。使用instanceof會(huì)返回false。
2.constructor屬性
- 使用方法:
arr.constructor === Array //return true or false
- constructor是prototype對(duì)象的一個(gè)屬性,默認(rèn)指向prototype對(duì)象所在的構(gòu)造函數(shù)。constructor屬性的作用,是分辨原型對(duì)象到底屬于哪個(gè)構(gòu)造函數(shù)。
- 缺點(diǎn):同instanceof一樣,在不同的全局執(zhí)行環(huán)境下,實(shí)例化的對(duì)象彼此不共享原型鏈,故使用constructor會(huì)返回false。
3.isArray
- 使用方法:
Array.isArray(value) //return true or false
- ECMAScript5新增,解決了在不同全局執(zhí)行環(huán)境創(chuàng)建的問題。
- 支持Array.isArray()方法的瀏覽器有IE9+、Firefox 4+、Safari 5+、Opera 10.5+和Chrome。
4.Object.prototype.toString
- 使用方法:
Object.prototype.toString.call(arr) == "[object Array]" //return true or false
- 在任何值上調(diào)用Object原生的
toString()
方法,都會(huì)返回一個(gè)[object NativeConstructorName]
格式的字符串。每個(gè)類在內(nèi)部都有一個(gè)[[class]]
屬性([[]]用來表示語(yǔ)言內(nèi)部用到的、外部不可直接訪問的屬性,稱為“內(nèi)部屬性”),這個(gè)屬性中就指定了上訴字符串中的構(gòu)造函數(shù)名。 - 利用這個(gè)方法,再配合call,我們可以取得任何對(duì)象的內(nèi)部屬性
[[Class]]
,然后把檢測(cè)類型轉(zhuǎn)化為字符串進(jìn)行比較。 - 因?yàn)?code>.toString()方法可能會(huì)被改寫,使用
prototype
上的toString()
方法更加具有安全性。 - 這種方法在識(shí)別內(nèi)置對(duì)象時(shí)往往十分有用,但對(duì)于自定義對(duì)象請(qǐng)不要使用這種方法。