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 相关文章推荐
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
js apply/call/caller/callee/bind使用方法与区别分析
Oct 28 Javascript
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
JS隐藏参数post传值实例
Apr 18 Javascript
Jquery easyui 下loaing效果示例代码
Aug 12 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
js实现tab切换效果实例
Sep 16 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
May 25 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
Feb 27 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的宝库目录--PEAR
2006/10/09 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
js 操作符汇总
2014/11/08 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
react-native fetch的具体使用方法
2017/11/01 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
在Python中实现贪婪排名算法的教程
2015/04/17 Python
Python中IPYTHON入门实例
2015/05/11 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
python中取绝对值简单方法总结
2020/07/24 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
大学生学业生涯规划
2014/01/05 职场文书
四好少年事迹材料
2014/01/12 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书