1.instanceof
- 使用方法:
arr instanceof Array //return true or false
- instanceof的原理是檢查原型鏈义矛,所以只能用于對象,不能用于基本類型。但對基本包裝類型(Number、Boolean奥喻、String類型)岳锁,因為其本質(zhì)是引用類型,故能夠用instanceof來判斷卒暂。
- 缺點:instanceof假定只有一個全局環(huán)境,如果網(wǎng)頁中包含多個框架榨咐,那實際上就存在多個不同的全局執(zhí)行環(huán)境介却,從而存在兩個以上不同版本的Array構(gòu)造函數(shù)。如果你從一個框架向另一個框架傳入一個數(shù)組块茁,那么傳入的數(shù)組與在第二個框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)齿坷。使用instanceof會返回false。
2.constructor屬性
- 使用方法:
arr.constructor === Array //return true or false
- constructor是prototype對象的一個屬性数焊,默認(rèn)指向prototype對象所在的構(gòu)造函數(shù)永淌。constructor屬性的作用,是分辨原型對象到底屬于哪個構(gòu)造函數(shù)佩耳。
- 缺點:同instanceof一樣遂蛀,在不同的全局執(zhí)行環(huán)境下,實例化的對象彼此不共享原型鏈干厚,故使用constructor會返回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()
方法,都會返回一個[object NativeConstructorName]
格式的字符串闲先。每個類在內(nèi)部都有一個[[class]]
屬性([[]]用來表示語言內(nèi)部用到的状土、外部不可直接訪問的屬性,稱為“內(nèi)部屬性”)伺糠,這個屬性中就指定了上訴字符串中的構(gòu)造函數(shù)名蒙谓。 - 利用這個方法,再配合call退盯,我們可以取得任何對象的內(nèi)部屬性
[[Class]]
彼乌,然后把檢測類型轉(zhuǎn)化為字符串進(jìn)行比較泻肯。 - 因為
.toString()
方法可能會被改寫,使用prototype
上的toString()
方法更加具有安全性慰照。 - 這種方法在識別內(nèi)置對象時往往十分有用灶挟,但對于自定義對象請不要使用這種方法。