数组与对象的判断

数组与对象的判断

本文主要讲解如何判断一个‘typeof’返回值为object的对象是数组还是对象(当然,数组也是对象,但是在实际中往往需要更精确的判断)。其实,重点还是在于理解Object中的toString方法的工作原理

下面是精确判断数组与对象的方法

通过constructor判断

    var arr = [];
    var obj = {};

    console.log(arr.constructor);
    console.log(obj.constructor);

    console.log(arr.constructor === Array);//true
    console.log(arr.constructor === Object);//false
    console.log(obj.constructor === Object);//true

通过instanceof判断

    var arr = [];
    var obj = {};

    console.log(arr instanceof Array);//true
    console.log(arr instanceof Object);//true

    console.log(obj instanceof Object);//true
    console.log(obj instanceof Array);//false

因此可以通过‘对象 instanceof Array’来判断

上述两种方式在跨iframe时是不能使用的,因为每个iframe都有自己独立的执行环境,因此在每个iframe中的Array与Object对象都是相互独立的

通过Object.prototype.toString.call(…)判断

    var arr = [];
    var obj = {};

    console.log(Object.prototype.toString.call(arr));//[object Array]
    console.log(Object.prototype.toString.call(obj));//[object Object]

疑问是——Object中的toString为什么会返回这样的值呢?

这是因为:

所有typeof 返回值为”object” 的对象(如数组)都包含一个内部属性[[Class]](我们可以把它看作一个内部的分类,而非传统的面向对象意义上的类)

这种形式([[…]])的属性是不能直接访问的,属于内置属性。但是,我们可以通过Object中的toString方法查看

[[Class]] 属性和创建该对象的内建原生构造函数相对应(如下),但并非总是如此(比如null与undefined,他们的[[class]]分别为——Null、Undefined)

ps:本文案参考了下列书籍
《你不知道的JavaScript》(中卷)

猜你喜欢

转载自blog.csdn.net/earth_smallma/article/details/81103308