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 相关文章推荐
鼠标滚轮控制网页横向移动实现思路
Mar 22 Javascript
jQuery操作select下拉框的text值和value值的方法
May 31 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
js removeChild 方法深入理解
Aug 16 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
Mar 04 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
this在vue和小程序中的使用详解
Jan 28 Javascript
Vue实现点击按钮复制文本内容的例子
Nov 09 Javascript
vue 授权获取微信openId操作
Nov 13 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 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
15种PHP Encoder的比较
2007/04/17 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
PHP实现常用排序算法的方法
2020/02/05 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
js倒计时抢购实例
2015/12/20 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
Python fileinput模块使用介绍
2014/11/30 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
教师试用期自我鉴定
2014/02/12 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
法人授权委托书格式
2014/04/08 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
文艺节目主持词
2015/07/06 职场文书