isArray()函数(JavaScript中对象类型判断的几种方法)


Posted in Javascript onNovember 26, 2009

1) typeof 运算符
typeof 是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。
但 typeof 的能力有限,其对于Date、RegExp类型返回的都是"object"。如:

typeof {}; // "object"
typeof []; // "object"
typeof new Date(); // "object"

所以它只在区别对象和原始类型的时候才有用。要区一种对象类型和另一种对象类型,必须使用其他的方法。如:instanceof 运算符或对象的 constructor 属。

2)instanceof 运算符。
instanceof 运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object 是 class 或构造函数的实例,则 instanceof 运算符返回 true。如果 object 不是指定类或函数的实例,或者 object 为 null,则返回 false。如:

[] instanceof Array; // true
[] instanceof Object; // true
[] instanceof RegExp; // false
new Date instanceof Date; // true

所以,可以用instanceof运算符来判断对象是否为数组类型:

function isArray(arr)
{
return arr instanceof Array;
}

3)constructor 属性。
JavaScript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,常用于判断未知对象的类型。如给定一个求知的值通过typeof运算符来判断它是原始的值还是对象。如果是对象,就可以使用constructor属性来判断其类型。所以判断数组的函数也可以这样写:

function isArray(arr)
{
return typeof arr == "object" && arr.constructor == Array;
}

很多情况下,我们可以使用instanceof运算符或对象的constructor属性来检测对象是否为数组。例如很多JavaScript框架就是使用这两种方法来判断对象是否为数组类型。
但是检测在跨框架(cross-frame)页面中的数组时,会失败。原因就是在不同框架(iframe)中创建的数组不会相互共享其prototype属性。例如:

<script> 
window.onload=function(){ 
var iframe_arr=new window.frames[0].Array; 
alert(iframe_arr instanceof Array); // false 
alert(iframe_arr.constructor == Array); // false 
} 
</script> <body> 
<iframe></iframe> 
</body>

在Ajaxian上看到了一种精确的检测方法,跨原型链调用toString()方法:Object.prototype.toString()。可以解决上面的跨框架问题。

当Object.prototype.toString(o)执行后,会执行以下步骤:
1)获取对象o的class属性。
2)连接字符串:"[object "+结果(1)+"]"
3)返回 结果(2)

例如:

Object.prototype.toString.call([]); // 返回 "[object Array]"
Object.prototype.toString.call(/reg/ig); // 返回 "[object RegExp]"

这样,我们就可以写一个健壮的判断对象是否为数组的函数:

function isArray(arr) 
{ 
return Object.prototype.toString.call(arr) === "[object Array]"; 
}

此种方法得到国外多个javaScript大师的认可,在即将发布的jQuery 1.3中将使用这种方法来检测数组。

prototype.js的一个维护者写了下面这个函数,用于获取对象的类型名

function __getClass(object)
{
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
};

扩展一下,用于检测各种对象类型:

var is = 
{ 
types : ["Array", "Boolean", "Date", "Number", "Object", "RegExp", "String", "Window", "HTMLDocument"] 
} for(var i = 0, c; c = is.types[i ++ ]; ) 
{ 
is[c] = (function(type) 
{ 
return function(obj) 
{ 
return Object.prototype.toString.call(obj) == "[object " + type + "]"; 
} 
} 
)(c); 
} 
alert(is.Array([])); // true 
alert(is.Date(new Date)); // true 
alert(is.RegExp(/reg/ig)); // true
Javascript 相关文章推荐
js模拟弹出效果代码修正版
Aug 07 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
Jul 26 Javascript
映彩衣的js随笔(js图片切换效果)
Jul 31 Javascript
javascript页面渲染速度测试脚本分享
Apr 15 Javascript
js验证框架实现代码分享
May 18 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
Jun 10 Javascript
JavaScript模块模式实例详解
Oct 25 Javascript
vue实现在表格里,取每行的id的方法
Mar 09 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 Javascript
Postman参数化实现过程及原理解析
Aug 13 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
Oct 09 Javascript
原生js实现移动小球(碰撞检测)
Dec 17 Javascript
Exitjs获取DataView中图片文件名
Nov 26 #Javascript
网页中的图片的处理方法与代码
Nov 26 #Javascript
js 动态选中下拉框
Nov 26 #Javascript
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
Nov 26 #Javascript
JS在IE和FF下attachEvent,addEventListener学习笔记
Nov 26 #Javascript
JS小框架 fly javascript framework
Nov 26 #Javascript
jquery.ui.progressbar 中文文档
Nov 26 #Javascript
You might like
Smarty模板快速入门
2007/01/04 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
使用cx_freeze把python打包exe示例
2014/01/24 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
yy结婚证婚词
2014/01/10 职场文书
个人能力自我鉴赏
2014/01/25 职场文书
光盘行动倡议书
2014/02/02 职场文书
《乡愁》教学反思
2014/02/18 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
中学生自我评价范文
2015/03/03 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python