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 相关文章推荐
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
20款超赞的jQuery插件 Web开发人员必备
Feb 26 Javascript
基于jquery的获取浏览器窗口大小的代码
Mar 28 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
改变状态栏文字的js代码
Jun 13 Javascript
js中this用法实例详解
May 05 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
May 05 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 Javascript
Vue简单实现原理详解
May 07 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
Vue Element UI自定义描述列表组件
May 18 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
vue实现图片预览组件封装与使用
2019/07/13 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
使用python 将图片复制到系统剪贴中
2019/12/13 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Python-opencv 双线性插值实例
2020/01/17 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
Python matplotlib实时画图案例
2020/04/23 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
数据管理员的自我评价分享
2013/11/15 职场文书
中学家长会邀请函
2014/02/03 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
创业融资计划书
2014/04/25 职场文书
2014年老干部工作总结
2014/11/21 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
教师评职称工作总结2015
2015/04/20 职场文书