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 绑定事件时传递参数的实现方法
Oct 13 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
Jun 05 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Sep 04 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
Sep 27 Javascript
jQuery实现ctrl+enter(回车)提交表单
Oct 19 Javascript
js实现网页收藏功能
Dec 17 Javascript
原生js实现倒计时功能(多种格式调用)
Jan 12 Javascript
详解如何在angular2中获取节点
Nov 23 Javascript
Vue结合后台导入导出Excel问题详解
Feb 19 Javascript
CountUp.js实现数字滚动增值效果
Oct 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHP 金额数字转换成英文
2010/05/06 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python使用matplotlib画饼状图
2018/09/25 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
德国旅游网站:weg.de
2018/06/03 全球购物
运动会100米解说词
2014/01/23 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
小学语文教研活动总结
2014/07/01 职场文书
项目投资合作意向书
2014/07/29 职场文书
房地产端午节活动方案
2014/08/24 职场文书
个人买房协议书范本
2014/10/06 职场文书
刑事撤诉申请书
2015/05/18 职场文书
死亡诗社观后感
2015/06/05 职场文书
《游戏公平》教学反思
2016/02/20 职场文书