JS判断数组四种实现方法详解


Posted in Javascript onJune 29, 2020

一、前言

如何判断一个对象或一个值是否是一个数组,在面试或工作中我们常常会遇到这个问题,既然出现频率高,想着还是做个整理,那么本文主要基于几种判断方式,以及方式判断的原理,是否存在问题展开讨论。

二、判断对象是否是数组的几种方式

1.通过instanceof判断

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

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

在上方代码中,instanceof运算符检测Array.prototype属性是否存在于变量a的原型链上,显然a是一个数组,拥有Array.prototype属性,所以为true。

存在问题:

需要注意的是,prototype属性是可以修改的,所以并不是最初判断为true就一定永远为真。

其次,当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象,instanceof的验证结果可能不会符合预期,例如:

//为body创建并添加一个iframe对象
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//取得iframe对象的构造数组方法
xArray = window.frames[0].Array;
//通过构造函数获取一个实例
var arr = new xArray(1,2,3); 
arr instanceof Array;//false

导致这种问题是因为iframe会产生新的全局环境,它也会拥有自己的Array.prototype属性,让不同环境下的属性相同很明显是不安全的做法,所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array为true,你得保证arr是由原始Array构造函数创建时才可行。

2.通过constructor判断

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

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

同样,这种判断也会存在多个全局环境的问题,导致的问题与instanceof相同。

//为body创建并添加一个iframe标签
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//取得iframe对象的构造数组方法
xArray = window.frames[window.frames.length-1].Array;
//通过构造函数获取一个实例
var arr = new xArray(1,2,3); 
arr.constructor === Array;//false

3.通过Object.prototype.toString.call()判断

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

let a = [1,2,3]
Object.prototype.toString.call(a) === '[object Array]';//true

它强大的地方在于不仅仅可以检验是否为数组,比如是否是一个函数,是否是数字等等

//检验是否是函数
let a = function () {};
Object.prototype.toString.call(a) === '[object Function]';//true
//检验是否是数字
let b = 1;
Object.prototype.toString.call(a) === '[object Number]';//true

甚至对于多全局环境时, Object.prototype.toString().call()也能符合预期处理判断。

//为body创建并添加一个iframe标签
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//取得iframe对象的构造数组方法
xArray = window.frames[window.frames.length-1].Array;
//通过构造函数获取一个实例
var arr = new xArray(1,2,3); 
console.log(Object.prototype.toString.call(arr) === '[object Array]');//true

4.通过Array.isArray()判断

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

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

简单好用,而且对于多全局环境,Array.isArray() 同样能准确判断,但有个问题,Array.isArray() 是在ES5中提出,也就是说在ES5之前可能会存在不支持此方法的情况。怎么解决呢?

三、判断数组方法的最终推荐

当然还是用Array.isArray(),从ES5新增isArray()方法正是为了提供一个稳定可用的数组判断方法,不可能专门为此提出的好东西不用,而对于ES5之前不支持此方法的问题,我们其实可以做好兼容进行自行封装,像这样:

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

那么对于数组判断的几种方式也说完了,合理的推荐也给出了,有什么问题或者错误的地方欢迎大家支持

参考资料:

Determining with absolute accuracy whether or not a JavaScript object is an array

Array.isArray()---MDN

instanceof---MDN

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS中style属性
Oct 11 Javascript
JavaScript 布尔操作符解析  && || !
Aug 10 Javascript
JQuery表格内容过滤的实现方法
Jul 05 Javascript
JS下拉框内容左右移动效果的具体实现
Jul 10 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
Jan 26 Javascript
javascript包装对象实例分析
Mar 27 Javascript
JavaScript模拟push
Mar 06 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
Jun 03 Javascript
vue 获取及修改store.js里的公共变量实例
Nov 06 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
Jul 20 Javascript
Javascript中async与await的捕捉错误详解
Mar 03 Javascript
vue实现整屏滚动切换
Jun 29 #Javascript
vue实现页面切换滑动效果
Jun 29 #Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 #Javascript
Vue.js中Line第三方登录api的实现代码
Jun 29 #Javascript
vue实现列表滚动的过渡动画
Jun 29 #Javascript
element跨分页操作选择详解
Jun 29 #Javascript
vue实现数字滚动效果
Jun 29 #Javascript
You might like
自己动手做一个SQL解释器
2006/10/09 PHP
PHP新手上路(十一)
2006/10/09 PHP
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
python实现日常记账本小程序
2018/03/10 Python
python实现批量图片格式转换
2020/06/16 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
网络工程师的自我评价
2013/10/02 职场文书
校庆活动方案
2014/03/31 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
房产协议书范本2014
2014/09/30 职场文书
步步惊心观后感
2015/06/12 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
JavaScript文档对象模型DOM
2021/11/20 Javascript