1. 程式人生 > >面試題:判斷一個物件是不是陣列型別

面試題:判斷一個物件是不是陣列型別

<script>
      //判斷一個物件是不是陣列型別 typeof不能檢視所有型別
    var obj1={x:1,y:2},
        obj2=[1,2,3],
        obj3=new Date();
        //1.判斷爹(原型物件)
    console.log(
      obj1.__proto__==Array.prototype,//false
      obj2.__proto__==Array.prototype,//true
      obj3.__proto__==Array.prototype,//false
      //條件,//false
      //條件,//true
      //條件,//false
    );
    //
    console.log(
      Array.prototype.isPrototypeOf(obj1),//Array的老公是obj1的爹嗎
      Array.prototype.isPrototypeOf(obj2),
      Array.prototype.isPrototypeOf(obj3),
    );
    //2.判斷媽媽(建構函式)
    //每個原型物件有一個constructor屬性,指向建構函式
    console.log(
    obj1.constructor==Array,
    obj2.constructor==Array,
    obj3.constructor==Array,
    );
    console.log(
      obj1 instanceof Array,//instanceof-->例項  obj1 是Array的例項嗎?
      obj2 instanceof Array,
      obj3 instanceof Array,
    );
    obj4={x:1,y:2};
    //嚴謹
    //3.驗DNA(每個物件中都隱藏著一個class屬性,記錄著物件建立時的型別名,不隨著繼承關係的改變而改變)
    //物件的祖宗是object,他的方法中存在toString方法返回的是一個型別[object 內建型別],但是最直接用toString的時候,js會認為在檢視內容,在其原型物件中建立一個toString方法,所以不會輸出型別,只有用call這個不講理的方法會讓物件找到想要用的函式。
    console.log(
      Object.prototype.toString.call(obj1)=="[object Array]",
      Object.prototype.toString.call(obj2)=="[object Array]",
      Object.prototype.toString.call(obj3)=="[object Array]",
      //Object.prototype.toString.call(obj4)=="[object Array]",
      /*obj1.toString(),
      obj2.toString(),
      obj3.toString(),*/
      );
    //4.Array.isArray()嚴謹
    console.log(
      Array.isArray(obj1),
      Array.isArray(obj2),
      Array.isArray(obj3),
    );
    
  </script>