判断是否为数组的4种方法

2020-05-28  本文已影响0人  暖年的咆哮

1、instanceof

instanceof运算符用于检验构造函数的prototype属性是否出现在对象的原型链中的任何位置,返回一个布尔值。

let a = []
a instanceof Array
//true
let b = {}
b instanceof Array
//false

instanceof通过判断某个数值是否出现在与其对应的数据类型的原型链上来作为依据,在大多数情况下是可以准确判断出一个值的数据类型是什么的,但是我们要知道,prototype属性是可以被修改的,所以可能会出现第一次判断为true之后,再修改了prototype的值之后再去判断,就会出现false的情况

2、construator

实例的构造函数属性constructor指向实例本身,那么通过constructor属性也可以判断是否为一个数组。

let a = [1,3,4];
a.constructor === Array;//true

以上2种方法,对于已知实例类型,可以很方便的进行判断,需要注意的是,construatorinstanceof一样,判断会存在多个全局环境的问题,典型的就是iframe标签会同时存在一个或者多个全局环境,会影响到这2种方法的判断结果

3、Object.prototype.String.call()

Object.prototype.toString().call()可以获取到对象的不同类型,例如

//检验是否为数组
let a = [1,2,3]
Object.prototype.toString.call(a) === '[object Array]';//true
//检验是否是函数
let b = function () {};
Object.prototype.toString.call(b) === '[object Function]';//true
//检验是否是数字
let c = 1;
Object.prototype.toString.call(c) === '[object Number]';//true
//检验是否为对象
let d = {};
Object.prototype.toString.call(d) === '[object Object]' //true

4、Array.isArray()

Array.isArray() 用于确定传递的值是否是一个数组,返回一个布尔值。

let a = [1,2,3]
Array.isArray(a);//true

此方法是ES5提供的新方法,对于某些不支持ES5的浏览器可能就不使用,那么我们需要配合Object.prototype.toString.call()对他进行封装一下

function checkArray(arg){
    if (!Array.isArray) {
      Array.isArray = function(arg) {
        return Object.prototype.toString.call(arg) === '[object Array]';
      };
    }
}
上一篇下一篇

猜你喜欢

热点阅读