【自学笔记】 原生JavaScript判断一个变量是否为数组,利用原型对象

记得一次面试,面试官问我,如何判断一个变量为数组,然后我在网上看到面经,里面这么写道:

arr1 === Array

当时我坚信不疑,并没有测试过,然后我就这么回答了面试官,结果gg。。

之后在尝试与搜寻下得到的最佳答案是:

        function isArray(obj) {
            return Object.prototype.toString.call(obj) === '[object Array]';
        }

嗯嗯,这样确实解决了我的问题,但是我记性不好,老是记不出,正好今天看了原型对象与实例的关系,我得到了更简单的解决方案:

        function isArray2(obj) {
            return obj.constructor == Array;
        }

对象实例都有一个叫做[[Prototype]]或_ proto_的指针指向构造函数的原型对象,每次访问对象实例会先搜索本身的属性,如果没有就会搜索构造函数的原型对象,原型对象里默认有一个属性constructor指向构造函数本身:

这里写图片描述

引用http://blog.csdn.net/ljl157011/article/details/19677059

            var arr1 = [];
            var arr2 = new Array(1, 1, 2);

            alert(arr1.constructor == Array;)
            alert(arr2.constructor == Array;)
            //arr2实例,没有constructor属性就会搜索到原型对象中的
            //constructor,指向的构造函数为Array,所以返回true
            //可以依此来判断变量是否是数组

关于constructor兼容性问题,从菜鸟教程上得到的解释:
所有主要浏览器都支持constructor属性。

最后附上执行代码及结果:

   <script type="text/javascript">
        window.onload = function () {
            var arr1 = [];
            var a = 8;
            var arr2 = new Array(1, 1, 2);
            console.log(isArray(arr1));
            console.log(isArray2(arr1));
            console.log(isArray(arr1));
            console.log(isArray2(arr2));


            console.log(isArray2(a));
            console.log(arr1 === Array);

            console.log(arr1.constructor);//大家可以看下输出值是什么
        }
        function isArray(obj) {
            return Object.prototype.toString.call(obj) === '[object Array]';
        }
        function isArray2(obj) {
            return obj.constructor == Array;
        }
    </script>

结果:
这里写图片描述

本人菜鸟 有所不对请指出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值