博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript 判断是否为数组 isArray()
阅读量:7071 次
发布时间:2019-06-28

本文共 2054 字,大约阅读时间需要 6 分钟。

JavaScript 在类型判断上确实是有比较多的坑,在不使用 ES5 的 Array.isArray() 的情况下,如何判断呢?

首先放弃typeof

javascript 弱类型的语言就是有比较多的坑,单纯的typeof 是很无力的。所以用它来判断数组肯定是不行的。

typeof 1    // number    typeof undefined  // undefined    typeof null // object    typeof []   // object    typeof {}   //object    typeof function (){} // function

那么言归正传正传,该如何判断。

思路一:length 属性判断

Array 对象都是有length 属性的,可不可以判断length

function isArray(array) {      return (typeof array === 'object' && typeof array.length === 'number')  }

与这个类似的是

function isArray(array) {      return (typeof array === 'object' && !isNaN(array.length))  }

但是这个存在的问题是,对于有length属性的对象,则会出现判断失误的问题

比如:

var fakeArray = {        length: 10,        value: 'Fake Array'    }

思路二:对Array实例对象的原型进行判断。

var arr = [1, 2, 3]    arr instanceof Array        // constructor 指向了原型    arr.constructor === Array

但在多iframe的情况下,由于每个iframe 是一个独立的环境,它们之间不不共享原型链,则通过原型进行判断会出现错误

var iframe = document.createElement('iframe')document.body.appendChild(iframe)xArray = window.frames[window.frames.length-1].Arrayvar arr = new xArray(1,2,3) // [1,2,3]// 正确的判断Array.isArray(arr)  // true// 有问题的判断arr instanceof Array // falsearr.constructor === Array // false

思路三: Object.prototype.toString.call() 方法

适用于所有环境,只支持原生的对象,Object的toString()方法不能检测非原生构造函数的构造函数名。开发人员自定义的任何构造函数都将返回[object Object]。在任何值上直接调用Object的原生toString()方法,都会返回[object NativeConstrctorName]格式的字符串,每个类内部都有一个class属性,这个属性中就指定了上述字符串中构造函数名。

 

Object.prototype.toString.call(array) === '[object Array]'

不过,上面的方案也存在一定问题,在ES6 中这样的判断可以被欺骗

var obj = {};    // ES6 Symbol    obj[Symbol.toStringTag] = 'Array';    // true    console.log(isArray(obj));

结论

在ES5 之后,就老老实实用Array.isArray 来判断,ES5之前可以使用上面pollyfill。

if (!Array.isArray) {        return Object.prototype.toString.call(array) === '[object Array]';    }
结论延伸

以此延伸,那么判断其他类型就可以使用类似的方法

var is = function (obj,type) {         return (type === "Null" && obj === null) ||             (type === "Undefined" && obj === void 0 ) ||             (type === "Number" && isFinite(obj)) ||             Object.prototype.toString.call(obj).slice(8,-1) === type;     }

参考:

1.

2.

转载地址:http://vwell.baihongyu.com/

你可能感兴趣的文章
jquery api调用
查看>>
算法之美--读书笔记
查看>>
数据库Sharding的基本思想和切分策略
查看>>
WinForm------SimpleButton去掉点击时的边框
查看>>
关于Lisp和函数式编程 & 各种语言对比 & TIOBE
查看>>
Amazon AWS S3 操作手册
查看>>
用CSS设置Table的细边框的最好用的方法
查看>>
FPGA按键去抖verilog代码
查看>>
读书笔记 —— 《css秘密花园》
查看>>
win7 windows server 2008R2下 https SSL证书安装的搭配(搭配https ssl本地测试环境)
查看>>
086实战 项目开发流程,以及什么是数据分析平台,再者为什么要做数据分析平台,数据来源,数据处理流程...
查看>>
甲醛(Formaldehyde)
查看>>
gitlab
查看>>
中国科学院数学所二阶椭圆偏微分方程考博试题
查看>>
VUE --- 给页面加点网络动态数据
查看>>
Atitti 载入类的几种方法 Class.forName ClassLoader.loadClass 直接new
查看>>
EL表达式
查看>>
基于JavaMail的Java邮件发送:简单邮件发送
查看>>
Atitit 软件体系的进化,是否需要一个处理中心
查看>>
MVC ---- Lambda表达式
查看>>