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 相关文章推荐
学习ExtJS 访问容器对象
Oct 07 Javascript
javascript与CSS复习(《精通javascript》)
Jun 29 Javascript
JQuery动态添加Select的Option元素实现方法
Aug 29 Javascript
jquery对所有input type=text的控件赋值实现方法
Dec 02 Javascript
Angular.JS中的this指向详解
May 17 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 Javascript
使用ECharts实现状态区间图
Oct 25 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 Javascript
微信小程序实现音乐播放器
Nov 20 Javascript
Javascript组合继承方法代码实例解析
Apr 02 Javascript
深入了解JS之作用域和闭包
Jun 16 Javascript
如何在vue 中使用柱状图 并自修改配置
Jan 21 Vue.js
图像替换新技术 状态域方法
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
PDO防注入原理分析以及注意事项
2015/02/25 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
js技巧--转义符"\"的妙用
2007/01/09 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
使用python统计文件行数示例分享
2014/02/21 Python
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
django加载本地html的方法
2018/05/27 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
python的命名规则知识点总结
2019/10/04 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
欧克利英国官网:Oakley英国
2019/08/24 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
洗发露广告词
2014/03/14 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
公司会议策划方案
2014/05/17 职场文书
投资入股合作协议书
2014/10/28 职场文书
股份转让协议书范本
2015/01/27 职场文书
个人专业技术总结
2015/03/05 职场文书