基于JS判断对象是否是数组


Posted in Javascript onJanuary 10, 2020

这篇文章主要介绍了基于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就一定永远为真。

其次,当我们的脚本拥有多个全局环境,例如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相同。

3、通过Object.prototype.toString.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

4、通过Array.isArray()判断

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

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

最终推荐方法

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

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

Javascript 相关文章推荐
如果文字过长,则将过长的部分变成省略号显示
Jun 26 Javascript
(仅IE下有效)关于checkbox 三态
May 12 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
学习使用jquery iScroll.js移动端滚动条插件
Mar 24 Javascript
JavaScript弹窗基础篇
Apr 27 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
Jun 20 Javascript
jQuery弹出遮罩层效果完整示例
Sep 13 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
Jul 05 Javascript
Scala解析Json字符串的实例详解
Oct 11 Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 Javascript
vue实现未登录跳转到登录页面的方法
Jul 17 Javascript
vue element自定义表单验证请求后端接口验证
Dec 11 Javascript
JS数组属性去重并校验重复数据
Jan 10 #Javascript
JS图片懒加载的优点及实现原理
Jan 10 #Javascript
jQuery操作元素的内容和样式完整实例分析
Jan 10 #jQuery
jquery选择器和属性对象的操作实例分析
Jan 10 #jQuery
js实现旋转木马轮播图效果
Jan 10 #Javascript
微信小程序新闻网站详情页实例代码
Jan 10 #Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 #Javascript
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
用mysql内存表来代替php session的类
2009/02/01 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
python操作mysql数据库
2017/03/05 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
编辑找工作求职信范文
2013/12/16 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
《问银河》教学反思
2014/02/19 职场文书
2014年征兵标语
2014/06/20 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
解除合同协议书范本
2016/03/21 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
Java Spring Lifecycle的使用
2022/05/06 Java/Android
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers