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实现拖拽 闭包函数详细介绍
Nov 25 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
May 21 Javascript
JQuery触发事件例如click
Sep 11 Javascript
js实现select跳转功能代码
Oct 22 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
jQuery常见面试题之DOM操作详析
Jul 05 jQuery
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
webpack之devtool详解
Feb 10 Javascript
vue和webpack项目构建过程常用的npm命令详解
Jun 15 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
vue商城中商品“筛选器”功能的实现代码
Jul 01 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
PHP的分页功能
2007/03/21 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
php获取excel文件数据
2017/04/21 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
为数据添加append,remove功能
2006/10/03 Javascript
js静态作用域的功能。
2006/12/25 Javascript
js调用flash的效果代码
2008/04/26 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
Python dict的常用方法示例代码
2020/06/23 Python
纽约手袋品牌:KARA
2018/03/18 全球购物
满月酒主持词
2014/03/27 职场文书
幼儿园家长寄语
2014/04/02 职场文书
股东合作协议书范本
2014/04/14 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
2014年文员工作总结
2014/11/18 职场文书
2015年大学生工作总结
2015/04/21 职场文书
作弊检讨书范文
2015/05/06 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书