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 相关文章推荐
基于jquery的大众点评,分类导航实现代码
Aug 23 Javascript
JS跨域代码片段
Aug 30 Javascript
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
JS特效实现图片自动播放并可控的效果
Jul 31 Javascript
使用Script元素发送JSONP请求的方法
Jun 12 Javascript
jQuery实现动态文字搜索功能
Jan 05 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
Sep 01 Javascript
在Vue中使用axios请求拦截的实现方法
Oct 25 Javascript
JavaScript实现打砖块游戏
Feb 25 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
Nov 04 Javascript
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
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
php下通过POST还是GET来传值
2008/06/05 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
javascript调试说明
2010/06/07 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
JS实现拼图游戏
2021/01/29 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
Python多进程编程技术实例分析
2014/09/16 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
python实现人脸识别代码
2017/11/08 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
会计系毕业个人自荐信格式
2013/09/23 职场文书
求职自荐信怎么写
2014/03/06 职场文书
群众路线党课主持词
2014/04/01 职场文书
任命书范本大全
2014/06/06 职场文书
交通事故被告答辩状
2015/05/22 职场文书
幽灵公主观后感
2015/06/09 职场文书
股东协议书范本2016
2016/03/21 职场文书
2019秋季运动会口号
2019/06/25 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python