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 相关文章推荐
JS实现距离上次刷新已过多少秒示例
May 23 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
Sep 13 Javascript
jquery使整个div区域可以点击的方法
Jun 24 Javascript
javascript中的Function.prototye.bind
Jun 25 Javascript
jQuery EasyUI 获取tabs的实例解析
Dec 06 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
May 03 Javascript
聊聊JS动画库 Velocity.js的使用
Mar 13 Javascript
使用JavaScript实现node.js中的path.join方法
Aug 12 Javascript
JavaScript实现简单随机点名器
Nov 21 Javascript
JS自定义右键菜单实现代码解析
Jul 16 Javascript
Vue router安装及使用方法解析
Dec 02 Vue.js
图像替换新技术 状态域方法
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和ACCESS写聊天室(九)
2006/10/09 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php模拟post提交数据的方法
2015/02/12 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
python中的多线程实例教程
2014/08/27 Python
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python用threading实现多线程详解
2017/02/03 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
浅谈python数据类型及类型转换
2017/12/18 Python
python自动化报告的输出用例详解
2018/05/30 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Python如何操作docker redis过程解析
2020/08/10 Python
设计模式的基本要素是什么
2014/04/21 面试题
高三体育教学反思
2014/01/29 职场文书
清明节演讲稿
2014/05/27 职场文书
毕业生求职信
2014/06/10 职场文书
大学生作弊检讨书
2014/09/11 职场文书
医院营销工作计划
2015/01/16 职场文书
贪污检举信范文
2015/03/02 职场文书
小学重阳节活动总结
2015/03/24 职场文书
开除通知书范本
2015/04/25 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript