判断一个对象是否数组类型的7中方法

说明:感谢东哥的解答,该文章仅供学习和参考,转载请注明出处。

<script>
        // 功能:判断一个数据是否是数组类型
        var n = 10,
            str = "javascript",
            b = true,
            nu = null,
            un;
        var f = function() {};
        var obj1 = {},
            obj2 = [6, 6, 6],
            obj3 = new Date();
        console.log(
                // 方法1:typeof
                //由此可以看出typeof只能判断出基本类型的数据类型,而不能判断引用类型的具体数据类型  
                typeof(n), //number 
                typeof(str), //string 
                typeof(b), //boolean 
                typeof(nu), //object 
                typeof(un), //undefined 
                typeof(f), //function
                typeof(obj1), //object 
                typeof(obj2), //object 
                typeof(obj3) //object 
            )
            // 判断子类型的原型对象,3种方式
            // 2.用__proto__获得父类的原型对象引用,然后再和数组的原型对象做比较
        console.log(
                obj1.__proto__ == Array.prototype, //false
                obj2.__proto__ == Array.prototype, //true
                obj3.__proto__ == Array.prototype //false
            )
            // 3.因为__proto__可能被浏览器禁用,所以通过等效于__proto__函数来替代__proto__:Object.getPrototypeOf(obj)
        console.log(
                Object.getPrototypeOf(obj1) == Array.prototype, //false
                Object.getPrototypeOf(obj2) == Array.prototype, //true
                Object.getPrototypeOf(obj3) == Array.prototype //false
            )
            //4.原理同2,实际上是对2的封装:father.isPrototypeOf(child)
        console.log(
                Array.prototype.isPrototypeOf(obj1), //false
                Array.prototype.isPrototypeOf(obj2), //true
                Array.prototype.isPrototypeOf(obj3) //false
            )
            // 通过构造函数来判断
            // 5.用父级原型对象中的constructor属性来判断
        console.log(
                obj1.constructor == Array, //false
                obj2.constructor == Array, //false
                obj3.constructor == Array //false
            )
            // 6.通过instanceof判断该实例是否属于数组类型,返回的bool类型
        console.log(
                obj1 instanceof Array, //false
                obj2 instanceof Array, //true
                obj3 instanceof Array //false
            )
            // 问题:如果将obj1的原型对象指向数组的原型对象,那么前面的判断都会出现问题,obj1则都会被判断为是数组类型
            // ,但是obj1本身不是数组类型的,此时应该如何解决这个问题呢?(即obj1.__proto__=Array.prototype)
            // 解决:每个对象再创建时,都会有一个内部属性class,相当于人的DNA,不能被随意访问到,class记录得时对象创建时得类型,
            // 不会随着原型对象得改变而改变.但是,此class被保存再顶级父对象Object中得同toString()方法中,上述得obj1,obj2,obj3
            // 中,由于obj1是直接创建得对象,故此时它得toString()指向得就是顶级父对象中得toStirng,但是obj2是一个数组,obj3为一个
            // 日期对象,故它们如果直接使用同toString()方法,则调用得是父类得原型对象中重写过后得toString(),obj2输出得是一个字符串,
            // 而obj3输出得是一个时间字符串。那么如何才能调用到顶级父对象中得toString()呢?需要通过。call()方法,绕过父类得原型对象
            // 获取到顶级父对象中得toString()
            // 7.通过.call()方法获取顶级父对象中隐藏得class,从而获取该对象创建时的真正的类型
            // 说明:[Object Array]中,object是对象的类型,而Array则为对象创建时的class,即对象的DNA,不会随着对象的原型对象的改变而发生改变
        console.log(
                Object.prototype.toString.call(obj1) === "[object Array]", //false
                Object.prototype.toString.call(obj2) === "[object Array]", //true
                Object.prototype.toString.call(obj3) === "[object Array]" //false
            )
            // 8.ES5中新增了一个专门判断一个对象是不是数组的函数:Array.isArray(obj) 返回bool类型的值
        console.log(
            Array.isArray(obj1), //false
            Array.isArray(obj2), //true
            Array.isArray(obj3) //false
        )
    </script>

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值