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 不间断的图片滚动并可点击
Jan 15 Javascript
js 实现打印网页中定义的部分内容的代码
Apr 01 Javascript
js操作select控件的几种方法
Jun 02 Javascript
10个基于Jquery的幻灯片插件教程
Oct 29 Javascript
javascript使用smipleChart实现简单图表
Jan 02 Javascript
js中的内部属性与delete操作符介绍
Aug 10 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
Aug 17 Javascript
SelecT下拉框选中和取值的解决方法
Nov 22 Javascript
JS解决移动web开发手机输入框弹出的问题
Mar 31 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
Jun 04 Javascript
Json实现传值到后台代码实例
Jun 30 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 has encountered an Access Violation
2007/01/15 PHP
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
JavaScript的parseInt 取整使用
2011/05/09 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
Python中atexit模块的基本使用示例
2015/07/08 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
浅谈python标准库--functools.partial
2019/03/13 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
大学军训通讯稿
2014/01/13 职场文书
农贸市场管理制度
2014/01/31 职场文书
《都江堰》教学反思
2014/02/07 职场文书
社区矫正工作方案
2014/06/04 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
给医院的感谢信
2015/01/21 职场文书
信访工作个人总结
2015/03/03 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript