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]';};
}

JS判断对象是不是数组相关推荐

  1. JS判断对象是不是数组“Array”

    2019独角兽企业重金招聘Python工程师标准>>> 在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢? typeof 操作符 对于Fun ...

  2. js判断对象还是数组

    1.对于Javascript 1.8.5(ECMAScript 5),变量名字.isArray( )可以实现这个目的 var a=[]; var b={}; Array.isArray(a);//tr ...

  3. js判断对象是否是数组的几种方式

    js判断对象是否是数组的几种方式 1.通过instanceof判断 instanceof运算符用于检验构造函数的prototype属性是否出现在对象的原型链中的任何位置,返回一个布尔值. let a ...

  4. JS判断对象是否为空(个人常用)

    JS判断对象是否为空 1.将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var isNull = (JSON.stringify( ...

  5. js判断对象是否为空

    文章目录 一.js判断对象是否为空(三种方法) 二.注: 1. JSON.stringify() 语法 参数说明: 2. Object.keys() 语法 参数 返回值 例子 3. for..in 语 ...

  6. JS判断对象是否为空的方法大全

    JS判断对象是否为空的方法大全 1.将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var b = (JSON.stringify( ...

  7. js判断对象数组中是否存在某个对象

    1. 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1 var arr=[1,2,3,4] arr.indexOf(3) // 2 ar ...

  8. JS判断变量是数组还是对象

    对数组和对象使用typeof,得出的结果都是"object" 使用以下五种方法区分是数组[]还是对象objec 方法一: 使用instanceof进行判断,A instanceof ...

  9. 一道Js判断对象是否相等面试题引发的故事

    话说,说什么呢,先看下题吧还是. ` function checkName(data) { if (data === { name: 'LIMING' }) { console.log("o ...

最新文章

  1. 巧用CSS的Light滤镜
  2. python关联规则挖掘_Python3:文本关联规则挖掘实现案例分析
  3. 解决ORACLE被锁定的资源两法
  4. c语言中fr,关于frwite()函数的一个问题,弄了好久就是不行,求解啊!
  5. 加密服务器显示到期,注册加密卡成功了,打开软件还是提示演示到期了,怎么解决?...
  6. 在IDEA中解决jar包冲突的神操作-必看,秒杀市面方法
  7. 数据仓库和数据库有什么区别
  8. 三实系统地址是什么意思_终于明白!火灾报警系统的余量应该如何设置?地址数又是什么?...
  9. vc2008调试技巧之输出重定向
  10. 软件工程专业要学什么课程?
  11. 基于单片机的电池管理系统
  12. 贴片电阻、贴片电容规格、封装、尺寸·功率
  13. 服务器显示拥挤进不去怎么办,《拥挤城市》游戏进不去怎么办 玩不了解决方法...
  14. 基于stm32的两轮自平衡小车4(软件调试篇)
  15. html a标签发微信,a标签的特殊和文本的样式
  16. 博达路由器如何配置互联网ip_博达路由器操作命令
  17. openwrt 透明代理上网
  18. leetcode日记
  19. un8.22:前端页面详情页面(代码篇)。
  20. 简单好用的ISD1820语音录放芯片

热门文章

  1. excel2019使用快捷键快速算总和的方法
  2. sql 累计占比_制作有累积和占比的销售统计表
  3. js二十五道面试题(含答案)
  4. 供应商配车/采购员配车车辆进厂~下发物流~库房接收~卸料确认
  5. 编程要从娃娃抓起,我们程序员界也算后继有人了!
  6. html5制作风扇步骤,摇头风扇制作全过程
  7. word排版快捷指令_十个绝对经典word排版小技巧WORD经典快捷100招
  8. 考场视频监控设计:如何基于EasyCVR打造考场在线巡查系统?
  9. SQL自定义排序规则
  10. 如果苹果1 元/个, 桔子2 元/个, 芒果4 元/个,若是用10 元去买,有几种组合呢?