面试题:判断一个对象是不是数组类型

<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>

猜你喜欢

转载自blog.csdn.net/weixin_42103706/article/details/83689280