数组与对象的判断
本文主要讲解如何判断一个‘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》(中卷)