js怎么判断一个对象是不是数组类型?
先来试试typeof
alert(typeof 1); // 返回字符串"number"
alert(typeof "1"); // 返回字符串"string"
alert(typeof true); // 返回字符串"boolean"
alert(typeof {}); // 返回字符串"object"
alert(typeof []); // 返回字符串"object "
alert(typeof function(){}); // 返回字符串"function"
alert(typeof null); // 返回字符串"object"
alert(typeof undefined); // 返回字符串"undefined"
其中,typeof {}和typeof []的结果都是object,那么问题来了,我怎么通过typeof去判断一个对象是不是数组类型呢?
对象是对象,数组也是对象,js中万物皆对象,很显然,通过简单的typeof运算符是不能够达到目的,我们得换个方法。
可以尝试以下几种方法:
1、从原型入手(认祖归宗),Array.prototype.isPrototypeOf(obj);
利用isPrototypeOf()方法,判定Array是不是在obj的原型链中,如果是,则返回true,否则false。
注:每个对象都有一个isPrototypeOf的API,继承自Object.prototype,用来判断father(Array)是否是child(obj)的父对象。
图片.png2、也可以从构造函数入手(它的亲娘)
(1)obj instanceof Array
先说说 typeof 和 instanceof 的区别?
两者都可以用来判断变量,typeof会返回基本类型,如文章开头,我们很简单可以用
typeof a != 'undefined' 判断a变量存在。而instanceof只会返回一个布尔值,那么我们试试,结果如下:
图片.png注: 这种方法有一个问题,就是验证不够严格。 即使对象创建时不是使用数组创建的,但是只要原型链上有数组类型,也认为是数组,如下面一段代码:
function Test(){}
Test.prototype = Array.prototype;
let test = new Test();
test instanceof Array; //true
(2) obj.constructor === Array
构造函数的prototype指向原型对象,同时,原型对象有constructor指回构造函数对象,constructor只在原型对象上有。
图片.png3、根据对象的class属性(类属性),跨原型链调用toString()方法。
图片.png4、Array.isArray()方法。
其实js已经提供了判断是不是数组类型的方法,如下:
图片.png