談談 js判斷陣列 那點事

找抽的小陀螺發表於2017-10-09

面試題中有個這樣題目 如何判斷陣列 大家都知道哪些方法
其實有時候 明明知道哪些方法 但在關鍵時候就是說不上來

  • typeof運算子
    typeof會返回這個型別的字串

      var a = '123'
      console.log(typeof(a)) //string
      var b = []
      console.log(typeof(b)) //object
      var c = {}
      console.log(typeof(c)) //object
      var d = null
      console.log(typeof(d)) //object複製程式碼

    上述看到 陣列 物件 null 用typeof返回都是object 這種方法不能識別出是否為陣列

  • 原型contructor鏈方法
    例項化有一個contructor屬性 這個屬性指向生成物件 陣列的方法

      var a = []
      console.log(a.__proto__.constructor)  //ƒ Array() { [native code] }
      var b = {}
      console.log(b.__proto__.constructor)  //ƒ Object() { [native code] }複製程式碼

    上述看到 陣列是由Array函式例項化的 物件由Object函式例項化來得
    感覺這種方法是可以了 但是 constructor這個屬性是可以被改寫的

       var a = []
       a.__proto__.constructor = Object
       console.log(a.__proto__.constructor)  //ƒ Object() { [native code] }複製程式碼

    可以看到 這個是 變成了陣列判斷成了物件 所以這個方法也不是最好的

  • instanceof
    這個方法是判斷某個建構函式的prototype屬性所指向的物件是否在另外一個要檢測物件的原型鏈上

       var a = []
       console.log(a instanceof Array)  //a物件的原型鏈上能找到Array  true
       console.log(a instanceof Object) //true  原型鏈上也能找到物件複製程式碼

    上述這種也不是特別好 判斷不出是陣列還是物件

  • 通用的方法 toString
    toString() 方法返回放映這個物件的字串

       var a= '123'
       console.log(a.toString()) //123
       var b = [1,2,3]
       console.log(b.toSting()) //1,2,3
       var c = {}
       console.log(c.toString)) //[object Object]複製程式碼

    可以看到只有物件返回物件型別
    返回[object type] type代表物件的型別
    判斷物件用Object的toString的方法拿過來用

      var a =[]
      Object.prototype.toString.call(a) //[object Array]複製程式碼

    這個物件 toString方法是可以判斷出是否為陣列
    但是這裡注意下有個情況就是物件原型上toString() 也是可以更改的

  • Array.isArray(XX)
    個人感覺還是使用通用方法 toString() 方法靠譜
    好了就擼到這裡

相關文章