JavaScript中检测对象的方法1.typeof操作符这种方法对于一些常用的类型来说那算是毫无压力,比如FunctionStringNumber、Undefined等,但是要是检测Array的对象就不起作用了。代码如下:alert(typeof null); // "object"alert(typeof function () {return 1;}); // "function"alert(typeof '梦龙小站'); // "string"alert(typeof 1); // "number"alert(typeof a); // "undefined"alert(typeof undefined); // "undefined"alert(typeof []); // "object"2.instanceof操作符这个操作符和JavaScript中面向对象有点关系,了解这个就先得了解JavaScript中的面向对象。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。var arr = [1,2,3,1];alert(arr instanceof Array); // true3.对象的constructor属性除了instanceof,每个对象还有constructor的属性,利用它似乎也能进行Array的判断。代码如下:var arr = [1,2,3,1];alert(arr.constructor === Array); // true第2种和第3种方法貌似无懈可击,但是实际上还是有些漏洞的,当你在多个frame中来回穿梭的时候,这两种方法就亚历山大了。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效!代码如下:var iframe = document.createElement('iframe'); //创建iframedocument.body.appendChild(iframe); //添加到body中xArray = window.frames[window.frames.length-1].Array;var arr = new xArray(1,2,3); // 声明数组[1,2,3]alert(arr instanceof Array); // falsealert(arr.constructor === Array); // false检测数组类型方法以上那些方法看上去无懈可击,但是终究会有些问题,接下来向大家提供一些比较不错的方法,可以说是无懈可击了。1.Object.prototype.toStringObject.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[objectArray]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。代码如下:function isArrayFn (o) {return Object.prototype.toString.call(o) === '[object Array]';}var arr = [1,2,3,1];alert(isArrayFn(arr));// truecall改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[objectArray]',以判断其是否是Array的实例。为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)JavaScript 标准文档中定义: [[Class]] 的值只可能是下面字符串中的一个: Arguments,Array, Boolean, Date, Error, Function, JSON, Math, Number, Object,RegExp, String.这种方法在识别内置对象时往往十分有用,但对于自定义对象请不要使用这种方法。2.Array.isArray()ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、Firefox 4+、Safari 5+、Opera 10.5+和Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。3.较好参考综合上面的几种方法,有一个当前的判断数组的最佳写法:代码如下:var arr = [1,2,3,1];var arr2 = [{ abac : 1, abc : 2 }];function isArrayFn(value){if (typeof Array.isArray === "function") {return Array.isArray(value);}else{return Object.prototype.toString.call(value) === "[object Array]";}}

转载于:https://juejin.im/post/5c751f46518825047b1cbc4a

判断变量是否为数组的几种方法相关推荐

  1. 如何判断数组的四种方法

    日常中我们会用typeOf运算符去判断数据的类型,结果如下 其中对于对象和数组用typeof方法得到的结果都是object,这是因为在JavaScript中所有数据类型严格意义上都是对象,对象是对象, ...

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

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

  3. Java中创建数组的几种方法

    Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...

  4. 知识点2:js(javascript)中检测是否为数组的两种方法【翻转数组案例】

    javascript基础知识 文章目录 javascript基础知识 前言 一.翻转数组案例 二.检测数组的两种方法 1.如果传输的参数不是数组 2.instanceof 运算符 可以用来检测是否满足 ...

  5. matlab合并有序数组,《数组合并》JS合并两个数组的3种方法详解

    这篇文章主要介绍了JS合并两个数组的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一个包解决你所有的JS问题,点击获取 需要将两个数组 ...

  6. java创建数组的两种方法

    java创建数组的两种方法 1,静态初始化 int[] array={1,2,3,4,5}; 2,动态初始化 1)先分配空间再给数组元素赋值 int[] array=new int[10]; //需指 ...

  7. java中创建数组的四种方法

    详细方法见如下四部分代码块 方法一: 详情见注释 //创建数组的第一种方法int[] arr=new int[6]; //通过创建对象的方法来声明一个数组对象int intValue=arr[5]; ...

  8. JavaScript判断是否为空对象的几种方法

    点击打开视频讲解 <template><div id="app"><h2>JavaScript判断是否为空对象的几种方法</h2>& ...

  9. linux脚本遍历数组,浅谈shell 遍历数组的几种方法

    背景 某天遇到一个问题,现象如下:第一种遍历正常打印元素,然而第二种遍历只会打印一个元素! #!/bin/bash # $1 代表文件目录 # 执行 eg: # sh your_shell.sh /u ...

最新文章

  1. 系统学习NLP(三)--NLP入门综述
  2. stm32 文件系统dma大小_「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验...
  3. orangepi找不到GPIO的解决方法
  4. ffmpeg 播放器原理
  5. Linux init详解 (0,1,2,3,4,5,6)
  6. ipfs操作mysql_IPFS 使用入门
  7. Android 系统(188)---In-Cell、On-Cell、OGS三种屏幕技术
  8. python中定义字典数据类型使用什么符号_python数据类型之字典类型-dict
  9. java对数据库的基础知识
  10. Java中的方法的重载
  11. 基于Android的城市环境监测系统
  12. TP6使用session
  13. 10个办公必备神器PPT网站,免费!!!
  14. mac系统克隆不能启动_如何制作Mac硬盘的可启动克隆
  15. python提取图片中的曲线_OpenCV如何提取图片中曲线
  16. Android图像滤镜框架GPUImage从配置到应用
  17. 图像处理篇二:图像颜色转换(OpenCV、PIL)
  18. 古城罗马、佛洛伦萨、庞贝、比萨一览
  19. (拼拼凑凑出来的)Kafka注意点(已注明出处)
  20. 非暴力沟通:简介及内容导航

热门文章

  1. 逆生长!小鼠「逆龄疗法」登Nature子刊,有望用于人类
  2. 群体决策是如何误入歧途的
  3. 华为在5.5G未来技术演进的六个方向!
  4. 《经济学人》万字长文:DeepMind和谷歌的AI拉锯战
  5. 一文看懂全球半导体格局
  6. 面对5G,华为、中兴及三大运营商怎么布局?
  7. 麦肯锡:物联网九大应用潜力无限 2025年经济价值高达11.1万亿美元
  8. 40 万年薪招应届生?OPPO 狂揽芯片人才,应届生招聘行情究竟如何?
  9. 阿里员工发帖吐槽人不如驴:你不能一边抽我,一边问我爱不爱你?
  10. UDP,你要耗子喂汁呀!