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.combobox中文api和例子,修复了上面的小bug
Mar 28 Javascript
jquery果冻抖动效果实现方法
Jan 15 Javascript
jQuery实现可展开合拢的手风琴面板菜单
Sep 15 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
Dec 15 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 Javascript
浅谈js for循环输出i为同一值的问题
Mar 01 Javascript
JS实现课堂随机点名和顺序点名
Mar 09 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
Aug 24 jQuery
vue axios同步请求解决方案
Sep 29 Javascript
vue2.0实现音乐/视频播放进度条组件
Jun 06 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
Mar 14 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生成excel文件的简单方法
2014/02/08 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
php操作access数据库的方法详解
2017/02/22 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
JavaScript 三种创建对象的方法
2009/10/16 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
Python装饰器用法实例分析
2019/01/14 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
python脚本定时发送邮件
2020/12/22 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
电气自动化大学生求职信
2013/10/16 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
python如何获取网络数据
2021/04/11 Python
CocosCreator入门教程之网络通信
2021/04/16 Javascript
基于Go语言构建RESTful API服务
2021/07/25 Golang