JavaScript 判断判断某个对象是Object还是一个Array


Posted in Javascript onJanuary 28, 2010

1.typeof 操作符.对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时

var arr=new Array("1","2","3","4","5"); 
alert(typeof(arr));

你会收到一个object 的答案,有点让人失望 .
2.instanceof 操作符,JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。
使用方法:result = object instanceof class,还是刚刚的数组,再来一次,嗯,成功的返回 true.

var arrayStr=new Array("1","2","3","4","5"); 
alert(arrayStr instanceof Array);

小总结:看样子我们今天讨论的问题已经得到了解答,但事实上在多个frame中穿梭就会产生大问题了.

代码

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
xArray = window.frames[window.frames.length-1].Array; 
var arr = new xArray("1","2","3","4","5");//这个写法IE大哥下是不支持的,FF下才有 
alert(arr instanceof Array); // false 
alert(arr.constructor === Array); // false

返回结果为两个False,让人大失所望。

ECMA-262 写道
Object.prototype.toString( ) When the toString method is called, the following steps are taken:
1. Get the [[Class]] property of this object.
2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
3. Return Result (2)
上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在ECMA标准中Array的描述吧:
ECMA-262 写道
new Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.
于是利用这点,第三种方法登场了。
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
} call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)
与前面几个方案不同,这个方法很好的解决了跨frame对象构建的问题,经过测试,各大浏览器兼容性也很好,可以放心使用。一个好消息是,很多框架,比如jQuery、Base2等等,都计划借鉴此方法以实现某些特殊的,比如数组、正则表达式等对象的类型判定,不用我们自己写了。

另外Ext3 也已经换成这样的写法了

isArray : function(v){ 
return toString.apply(v) === '[object Array]'; 
}
Javascript 相关文章推荐
javascript优先加载笔记代码
Sep 30 Javascript
利用JS重写Cognos右键菜单的实现代码
Apr 11 Javascript
flash遮住div问题的正确解决方法
Feb 27 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
Apr 06 Javascript
JavaScript DOM元素尺寸和位置
Apr 13 Javascript
ECMAScript6函数默认参数
Jun 12 Javascript
javascript生成随机数方法汇总
Nov 12 Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 Javascript
JavaScript实现鼠标移入随机变换颜色
Nov 24 Javascript
类和原型的设计模式之复制与委托差异
Jul 07 Javascript
图像替换新技术 状态域方法
Jan 28 #Javascript
javascript innerText和innerHtml应用
Jan 28 #Javascript
使用JavaScript库还是自己写代码?
Jan 28 #Javascript
js或css实现滚动广告的几种方案
Jan 28 #Javascript
jquery中的sortable排序之后的保存状态的解决方法
Jan 28 #Javascript
javascript面向对象的方式实现的弹出层效果代码
Jan 28 #Javascript
jquery 常用操作方法
Jan 28 #Javascript
You might like
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
php抽象类使用要点与注意事项分析
2015/02/09 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
PHP分享图片的生成方法
2018/04/25 PHP
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
python实现简单ftp客户端的方法
2015/06/28 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
理论讲解python多进程并发编程
2018/02/09 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
使用Scrapy爬取动态数据
2018/10/21 Python
Python的形参和实参使用方式
2019/12/24 Python
python3 字符串知识点学习笔记
2020/02/08 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
python从PDF中提取数据的示例
2020/10/30 Python
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
专科毕业生自我鉴定
2013/12/01 职场文书
励志演讲稿范文
2014/04/29 职场文书
升学宴演讲稿
2014/09/01 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
贪污检举信范文
2015/03/02 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python