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 相关文章推荐
看了就知道什么是JSON
Dec 09 Javascript
extJs 常用到的增,删,改,查操作代码
Dec 28 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
Jan 19 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
javascript变量提升和闭包理解
Mar 12 Javascript
JavaScript中常见内置函数用法示例
May 14 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
Aug 30 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
js页面加载后执行的几种方式小结
Jan 30 Javascript
jquery实现有过渡效果的tab切换
Jul 17 jQuery
js数组中去除重复值的几种方法
Aug 03 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实现文件安全下载
2006/10/09 PHP
新手学习PHP的一些基础知识分享
2011/07/27 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
laravel学习教程之存取器
2016/07/30 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python 连连看连接算法
2008/11/22 Python
python实现在windows下操作word的方法
2015/04/28 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
python面向对象 反射原理解析
2019/08/12 Python
python 实现目录复制的三种小结
2019/12/04 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
Django如何批量创建Model
2020/09/01 Python
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
21岁生日感言
2014/02/27 职场文书
办公室主任职责范本
2014/03/07 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
春季运动会加油词
2015/07/18 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫
python前后端自定义分页器
2022/04/13 Python