JS判断数组的六种方法详解

在JS中,数组是属于Object类型的,也就是属于引用类型(引用类型存放在堆内存中,在栈内存会有一个或者多个地址来指向这个堆内存)。数组

因此对于引用类型,咱们不能typeof来判断具体的类型,由于返回的都是‘object’。框架

接下来,我将介绍六种判断方法,而且对这六种方法进行逐一解析函数

① instanceof 操做符判断

用法:arr instanceof Array
instanceof 主要是用来判断某个实例是否属于某个对象测试

function obj(){}
let o1 = new obj();
console.log(o1 instanceof obj);  // true

那么咱们用instanceof 来判断数组的方法以下:prototype

let arr = [];
console.log(arr instanceof Array); // true
可是 instanceof 会有一个问题, 它的问题在于假定只有一个全局执行的环境。若是网页中包含多个框架,那实际上就存在 两个以上不一样的全局执行环境从而存在两个以上不一样版本的Array构造函数。若是你从一个框架向另外一个框架传入一个数组,那么传入的数组与在第二个框架中原生建立的数组分别具备不一样的构造函数。

②对象构造函数的 constructor判断

用法:arr.constructor === Array
Object的每一个实例都有构造函数 constructor,用于保存着用于建立当前对象的函数code

function obj(){}
let o1 = new obj();
console.log(o1.constructor === obj);  // true

如上所示,obj 的实例 o1 的 constructor 跟 obj 对象是相等的
那么咱们就能够用此来判断数组了对象

let arr = [];
console.log(arr.constructor === Array); // true

③Array 原型链上的 isPrototypeOf

用法:Array.prototype.isPrototypeOf(arr)
Array.prototype  属性表示 Array 构造函数的原型
其中有一个方法是 isPrototypeOf() 用于测试一个对象是否存在于另外一个对象的原型链上。继承

let arr = [];
console.log(Array.prototype.isPrototypeOf(arr)); // true

④Object.getPrototypeOf

用法:Object.getPrototypeOf(arr) === Array.prototype
Object.getPrototypeOf() 方法返回指定对象的原型内存

因此只要跟Array的原型比较便可原型链

let arr = [];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true

⑤Object.prototype.toString

用法:Object.prototype.toString.call(arr) === '[object Array]'

虽然Array也继承自Object,但js在Array.prototype上重写了toString,而咱们经过toString.call(arr)其实是经过原型链调用了。

let arr = [];
console.log(Object.prototype.toString.call(arr) === '[object Array]'); // true

⑥Array.isArray

用法:Array.isArray(arr)
ES5中新增了Array.isArray方法,IE8及如下不支持

Array.isArray ( arg )
isArray 函数须要一个参数 arg,若是参数是个对象而且 class 内部属性是 "Array", 返回布尔值 true;不然它返回 false。采用以下步骤:
           若是 Type(arg) 不是 Object, 返回 false。
           若是 arg 的 [[Class]] 内部属性值是 "Array", 则返回 true。
           返回 false.

let arr = [];
console.log(Array.isArray(arr)); // true
相关文章
相关标签/搜索