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 相关文章推荐
基于jquery实现点击左右按钮图片横向滚动
Apr 11 Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 Javascript
ie与ff下的event事件使用介绍
Nov 25 Javascript
基于javascript制作微信聊天面板
Aug 09 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 Javascript
JS定时器用法分析【时钟与菜单中的应用】
Dec 21 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
Jun 15 Javascript
js笔试题-接收get请求参数
Jun 15 Javascript
BootstrapValidator验证用户名已存在(ajax)
Nov 08 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
Jan 26 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
vue使用echarts实现水平柱形图实例
Sep 09 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生成plist数据的方法
2015/06/16 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
jquery自定义表格样式
2015/11/23 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
详解微信小程序 页面跳转 传递参数
2016/12/08 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
详解Python命令行解析工具Argparse
2016/04/20 Python
简单了解Django模板的使用
2017/12/20 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
Python类装饰器实现方法详解
2018/12/21 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
求职简历自我评价范例
2014/03/12 职场文书
保护母亲河倡议书
2014/04/14 职场文书
总经理人事任命书
2014/06/05 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL