在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢?

typeof 操作符

对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时

1 var arr=new Array("1","2","3","4","5");
2 alert(typeof(arr));

你会收到一个object 的答案,有点让人失望。

instanceof 操作符

JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。使用方法:result = object instanceof class,还是刚刚的数组,再来一次,嗯,成功的返回 true。

1 var arrayStr=new Array("1","2","3","4","5");
2 alert(arrayStr instanceof Array);

小总结:看样子我们今天讨论的问题已经得到了解答,但事实上在多个frame中穿梭就会产生大问题了。

1 var iframe = document.createElement('iframe');   
2 document.body.appendChild(iframe);   
3 xArray = window.frames[window.frames.length-1].Array;      
4 var arr = new xArray("1","2","3","4","5");//这个写法IE大哥下是不支持的,FF下才有
5         
6 alert(arr instanceof Array); // false
7 alert(arr.constructor === Array); // false

返回结果为两个False,让人大失所望。

ECMA-262 写道

Object.prototype.toString( ) When the toString method is called, the following steps are taken:

  1. Get the [[Class]] property of this object.
  2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
  3. Return Result (2)

上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在ECMA标准中Array的描述吧。

ECMA-262 写道

new Array([ item0[, item1 [,…]]])

The [[Class]] property of the newly constructed object is set to “Array”.

于是利用这点,第三种方法登场了。

1 function isArray(obj) {  
2   return Object.prototype.toString.call(obj) === '[object Array]';   
3 }

call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)

与前面几个方案不同,这个方法很好的解决了跨frame对象构建的问题,经过测试,各大浏览器兼容性也很好,可以放心使用。一个好消息是,很多框架,比如jQuery、Base2等等,都计划借鉴此方法以实现某些特殊的,比如数组、正则表达式等对象的类型判定,不用我们自己写了。

另外Ext3 也已经换成这样的写法了

1 isArray : function(v){
2             return toString.apply(v) === '[object Array]';
3         }

js如何判断一个对象是不是Array?相关推荐

  1. js如何判断一个对象是不是Array

    typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 var arr=new Array(&quo ...

  2. JS 中判断一个对象是否为数组对象?

    在面向对象中 判断一个对象中 判断一个对象是否为数组 1 可以查找它的原型 (__proto__) 是否为数组对象的原型对象 var arr1 = [1,2,3];console.log(arr1._ ...

  3. JS如何判断一个对象是否为空、是否有某个属性

    一.JS判断一个对象是否为空 方法一: let obj1 = {} let obj2 = {a:1} function empty(obj){for (let key in obj){return f ...

  4. [JS] 如何判断一个对象是否为空

    js判断空对象的几种方法 一.将对象转为字符串比较 let a = {} console.log(JSON.stringify(a) === '{}') //true 二.for-in循环 funct ...

  5. js中判断一个对象是否存在

    一.Boolean()方法 用Boolean()方法可以将Js中的任意数据类型转为布尔值: 二.用于判断xx是否存在 js一般会自动执行Boolean()方法,我们可以借此判断某个对象在js当前的执行 ...

  6. js判断一个对象是否是空对象

    一.写在前面 js如何判断一个对象是否是空对象,本文给出三个方法. 二.采用for-in-进行遍历 最常见的思路就是使用for....in...遍历属性,为真则为非空对象,为假则为空对象. <s ...

  7. js判断一个对象是否为空

    判断一个对象是否为空的三种方法 1.通过JSON自带的.stringify方法来判断 2.最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数 ...

  8. JS类型判断、对象克隆、数组克隆

    类型判断 我们先说一下JS的数据类型,我们一般说JS有六大数据类型(ES6以前)分别是: 基本数据类型 Number String Boolean null undefined 引用数据类型 obje ...

  9. html js 添加数据类型,js数据类型判断和转换

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 前言 无论笔试还是面试,总会问到数据类型和隐式转换.今天彻底整理一下这块的知识,希望对大家有帮助. 看到下面的题,是不是 ...

最新文章

  1. 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送
  2. windows下安装和配置Redis
  3. 消息称微软计划收购GitHub,估值超50亿美元
  4. 期末考试前的预习,科目:化工设备与反应器(5)
  5. Kubernetes:标签、选择器、注解、容忍度、亲和性
  6. 微软Silverlight,你应该知道的10件事
  7. 多字段回溯 mysql_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
  8. docker搭建zookeeper集群
  9. Intra Chroma Prediction
  10. 小米全球第二,雷军签发内部嘉奖令;亚马逊被欧盟处以创纪录的8.88亿美元罚款;​PyCharm 2021.2 发布|极客日报...
  11. 一主多备几影响 oracle,1个主库配置多个备库的问题
  12. iOS 控制器View加载顺序详细版
  13. 技嘉ide模式怎么改,电脑BIOS中怎么设置硬盘为IDE模式
  14. 一个输入手机号获取验证码的页面,包含哪些测试流程?
  15. 控制JetsonNano风扇命令
  16. java ctr_java – CTR模式使用初始向量(IV)
  17. spring context:property-placeholder无法加载配置文件,导致属性无效
  18. 第四期_Metasploit 基础(六)Meterprete《Metasploit Unleashed Simplified Chinese version(Metasploit官方文档教程中文版)》
  19. dropout原理解析
  20. zabbix Discovery rules

热门文章

  1. Log Buffer
  2. Hibernate 双向一对一实现(基于annotation)
  3. 用存储过程生成记录编号
  4. 服务机器人---建图工具
  5. 在WINCE5.0开始菜单中添加应用程序
  6. opus android编译,Mac系统opus Android编译集成
  7. Bugku-CTF之前女友(SKCTF)
  8. 深入理解并使用python的模块与包
  9. AIDL 客户端与服务端的双向通信
  10. Ajax单元测试傻瓜教程