ionic2.0+实战Web 前端开发 web前端经典面试题

js怎么判断一个对象是不是数组类型?

2018-07-18  本文已影响3人  全栈弄潮儿

先来试试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)的父对象。

图片.png

2、也可以从构造函数入手(它的亲娘)

(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只在原型对象上有。

图片.png

3、根据对象的class属性(类属性),跨原型链调用toString()方法。

图片.png

4、Array.isArray()方法。

其实js已经提供了判断是不是数组类型的方法,如下:

图片.png
上一篇下一篇

猜你喜欢

热点阅读