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 相关文章推荐
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
May 07 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
Nov 14 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
May 28 Javascript
AngularJS入门教程之数据绑定原理详解
Nov 02 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
Apr 11 Javascript
vue router2.0二级路由的简单使用
Jul 05 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
Aug 11 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
Oct 24 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
Apr 25 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
Oct 20 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
PHP生成RSS文件类实例
2014/12/05 PHP
phalcon框架使用指南
2016/02/23 PHP
php解决安全问题的方法实例
2019/09/19 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
python中requests模块的使用方法
2015/04/08 Python
Python合并字符串的3种方法
2015/05/21 Python
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
python conda操作方法
2019/09/11 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
橄榄树药房:OLIVEDA
2019/09/01 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
职高毕业生自我鉴定
2013/10/21 职场文书
食堂员工工作职责
2013/12/18 职场文书
党员教师工作决心书
2014/03/13 职场文书
企业活动策划方案
2014/06/02 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
夫妻吵架保证书
2015/05/08 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
你知道Java Spring的两种事务吗
2022/03/16 Java/Android