1. obj instanceof Array
我們都知道instanceof是用來判斷對象的類型的,並且所有的對象 instanceof Object結果都是true
- 內部機制是通過判斷對象的原型鏈中是否能找到同類型的prototype
- 其原理是一層一層查找__proto__,如果和constructor.prototype的值相等則返回true,否則返回false
根據這一點可得,如果想判斷一個對象是否是數組,需要判斷這個對象的原型鏈上是否存在Array的原型:
console.log([] instanceof Array) // true console.log([] instanceof Object) // true
很容易可以發現這個方法有個問題是無法判斷對象是屬於Object還是Array。
2. Array.isArray( obj )
obj是待檢測的對象,如果結果返回Array則整體返回true,否則該表達式返回false。
- ES5新增的方法
- Array.isArray()優於instanceof的地方在於:Array.isArray()可以檢測iframes
3. Object.prototype.toString.call( obj )
obj是待檢測的對象,這種方法能檢測出所有的基本數據類型!
QUESTION:為什么要用到call()呢?
每個繼承Object的對象都有toString()方法,在toString沒有被重寫的情況下,執行Object.prototype.toString會返回[object type],其中type是對象的類型。
- 如果是個基本數據類型調用toString()方法,比如字符串或者是一個數字,那么toString()會直接返回內容的字符串
- 如果直接調用Object.prototype.toString()的話,默認是指向Object,因此我們這里要調用call()或者apply()來改變toString的指向
var str = 'hello'; console.log(str.toString()) // hello console.log(Object.prototype.toString(str)) // [object Object] console.log(Object.prototype.toString.call(str)) // [object String]