分析三種判斷數組的方法


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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM