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_x_x_x('iframe');

document.body.a(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_x_x_x('iframe');

document.body.a(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_x_x_x('iframe');

document.body.a(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]';

};

}

java判断是否为数组_JS如何判断是否是数组?相关推荐

  1. java 判断手机运营商_JS正则表达式判断手机号所属运营商

    根据用户的输入手机号码判断该号的运营商是移动.联通.电信或其他,再根据不同的运营商做出相应的处理,下面介绍js中如何判断手机号的运营商的代码电话号码是电话管理部门为电话机设定的号码.一般7--8位数组 ...

  2. js if判断多个条件_JS条件判断小技巧(一)

    经常code review,我发现JS newbie很容易写出一堆冗长的代码.今天就列几个比较常见的"解决之道",看看如何减少JS里的条件判断. 提前返回,少用if...else ...

  3. 【排序】 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。(java)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  4. java数组求和递归,js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值...

    // 数组去重 var arr1 = [1,1,2,3,4,5,6,3,2,4,5,'a','b','c','a',6,7,8,3,5,7,8,34] // console.log(Array.fro ...

  5. 遍历strs数组,并判断数组中每一个元素的长度, * 将长度为偶数的元素和长度为奇数的元素分别存放在两个集合中,

    package Day08;import java.util.ArrayList;/*** 二* 字符串数组strs中包含字符串{"12","345",&quo ...

  6. java 判断一个词是不是成语_Java 判断字符串a和b是否互为旋转词

    旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词. 比如abc的旋转词有 abc,acb,cba,... 判断str1和str2是否互为旋转词,其最优解可以是时间复杂度 ...

  7. 绝对高效实现! 给你一个包含n个整数的数组nums,判断nums是否存在三个元素a,b,c使得a+b+c =0...

    所有实现代码均使用JAVA letcode上面有个算法题,贴原图 先分析一下: 第一个条件,a+b+c = 0,这个好办,最简单的就是循环三次,把所有情况都过一篇就可得到所有结果, 第二个条件,满足条 ...

  8. JAVA----动态初始化数组的null判断

    动态初始化数组的null判断 目前在学习java这方面时,自己动态初始化了一段数组: 有一段知识: 判断数组是否为null 在我自己作业时,我是直接判断数组是否为null: Student[] arr ...

  9. Python同Java同Js语言语法区别之四判断字符串列表字典是否相等

    字符串列表字典是否相等 前言 Python 字符串or数字 列表 字典 总结 Java 字符串 数组 Map 总结 JS 字符串 数组 对象 总结 前言 作为一枚测开工程师,需要的技能是全栈的,项目中 ...

最新文章

  1. 初识linux之文件管理
  2. pointnet分割自己的点云数据_点云学习历史文章大汇总
  3. ADSL(Asymmetric Digital Subscriber Loop)技术
  4. 制造工业中的机器学习应用:I概览
  5. cocoaPod安装过程
  6. linux-free命令
  7. Gridview一次更新所有记录
  8. 【语言处理与Python】10.1自然语言理解\10.2命题逻辑
  9. 查找指定日期数据所在分区数据
  10. SSIS - 7.发邮件任务
  11. OAuth 2.0介绍
  12. 训练深度学习模型的小技巧
  13. [转]8个实用而有 趣Bash命令提示行
  14. 【LaTeX】公式书写工具 | LaTeX转MathML(Word适用)| 公式截图转LaTeX| LaTeX学习(偏公式输入方面)
  15. 网易裁员,让保安把身患绝症的我赶出公司。我在网易亲身经历的噩梦!
  16. js怎样判断图片链接是否有效
  17. 透彻理解神经网络剪枝算法
  18. Apple和元宇宙,迄今为止我们所知道的一切
  19. 马尔科夫链Markov以及空间Markov Matlab代码
  20. STM32f1系列压力传感器MPX4250压力检测

热门文章

  1. 深度学习“四大名著”发布!Python、TensorFlow、机器学习、深度学习四件套(附免费下载)...
  2. 牛逼!用 12 万行代码堆出来个 蔡徐坤,编译还能通过!
  3. 博士大佬整理的机器学习算法知识手册 | 附PDF下载
  4. 生活有时会有点苦涩——一位第六年还没发paper的PHD的自述
  5. 推荐GitHub上几个比较热门的开源项目,记得收藏下!!!
  6. Linux 背后的思想
  7. 美多商城之商品(商品列表页)
  8. 超赞!YOLOv5的妙用:学习手语,帮助听力障碍群体
  9. OpenCV4 C++学习 必备基础语法知识二
  10. 最新!字节跳动再次扩招1000人,招聘要求令人窒息