js判断是否是数组的几种方法
一、前言
如何判断一个对象或一个值是否是数组或者对象,是我们在工作和面试中会经常碰到的一个问题,下面我们来讨论一下这几种情况:
二、判断对象是否是数组的几种方式
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就一定永远为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构造函数创建时才可行。
通过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]';}
}
以上就是我想说的几组判断是否是数组的方法
js判断是否是数组的几种方法相关推荐
- JS判断变量是不是数组的5种方法
方式一:isArray var arr=[1,2,3]; console.log(Array.isArray(arr)) 方式二:instanceof var arr=[1,2,3]; console ...
- matlab合并有序数组,《数组合并》JS合并两个数组的3种方法详解
这篇文章主要介绍了JS合并两个数组的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一个包解决你所有的JS问题,点击获取 需要将两个数组 ...
- js合并两个数组的三种方法
js合并数组的三种方法 前提:两个数组a=[1,2,3,4].b=[5,6,7],将其合并为一个数组 1. concat //js的Array对象提供了一个叫concat()方法,连接两个或更多的数组 ...
- 【JS】中遍历数组的几种方法
目录 1. for 遍历数组 1.1 for 的普通遍历 1.2 for 优化版遍历 2.while 遍历数组 3. for...in 方法 3.1 遍历数组 3.2 遍历对象 4. for...of ...
- js判断是否为对象的几种方法
var obj = {}: 1.toString(推荐) Object.prototype.toString.call(obj) === '[object Object]' 2.constructor ...
- 如何判断数组的四种方法
日常中我们会用typeOf运算符去判断数据的类型,结果如下 其中对于对象和数组用typeof方法得到的结果都是object,这是因为在JavaScript中所有数据类型严格意义上都是对象,对象是对象, ...
- javascript判断日期奇偶_JavaScript判断奇数和偶数的两种方法
JavaScript是前端开发中必不可少的一部分,那你知道如何用JS判断一个数是奇数还偶数吗?这篇文章就给大家分享JS判断奇数和偶数的两种方法,有一定的参考价值,感兴趣的朋友可以参考一下. 方法一:用 ...
- 知识点2:js(javascript)中检测是否为数组的两种方法【翻转数组案例】
javascript基础知识 文章目录 javascript基础知识 前言 一.翻转数组案例 二.检测数组的两种方法 1.如果传输的参数不是数组 2.instanceof 运算符 可以用来检测是否满足 ...
- html怎么创建数组,js创建数组的三种方法 JS数组去重的几种常见方法
JS数组有哪几种定义方式? js 里创建一个数组 那几种方式有什么区别吗?a = new Array(); b = []; 性能问题吗?? function clear(arr) { // 1 如何获 ...
- JS判断变量是数组还是对象
对数组和对象使用typeof,得出的结果都是"object" 使用以下五种方法区分是数组[]还是对象objec 方法一: 使用instanceof进行判断,A instanceof ...
最新文章
- NET中的异步编程(二)- 传统的异步编程
- red hat linux挂载u盘,请问怎样在Red Hat 9.0中使用U盘?
- JS 中对数组按照数组中某个对象的属性值进行排序
- 【java设计模式之Command(菜单命令) 】
- C++数据类型基础知识
- Windows button控件(按钮控件)
- 深入分析自定义表单验证与Cookies
- dpi数据接入shell脚本
- php统计图移动端,移动端可视化视图、统计图表集合(持续更新综合案例)原型...
- 基因表达谱热图的绘制
- android app 马甲包,关于Android多渠道打包和马甲包问题
- flyingsaucer进行html文件转图片和pdf
- 靶机渗透练习25-Funbox4-CTF
- 用Liveupdata 刷MSI主板Slic 2.1
- 性能提升30倍丨基于 DolphinDB 的 mytt 指标库实现
- 解读Unity中的CG编写Shader系列4——unity中的圆角矩形shader
- 英特尔oneAPI——异构计算学习总结
- 计算机病毒恶搞程序,【图片】我写的恶搞软件【病毒吧】_百度贴吧
- 机器学习与人工智能资源库
- No.84 柱状图中最大的矩形