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 相关文章推荐
Tab页界面 用jQuery及Ajax技术实现(php后台)
Oct 12 Javascript
javascript实现图片切换的幻灯片效果源代码
Dec 12 Javascript
删除条目时弹出的确认对话框
Jun 05 Javascript
JavaScript判断FileUpload控件上传文件类型
Sep 28 Javascript
解析Node.js基于模块和包的代码部署方式
Feb 16 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
关于JS中二维数组的声明方法
Sep 24 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
Jul 27 Javascript
vue-router权限控制(简单方式)
Oct 29 Javascript
vue项目中引入vue-datepicker插件的详解
May 14 Javascript
layui的select联动实现代码
Sep 28 Javascript
es6函数之rest参数用法实例分析
Apr 18 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
一个程序下载的管理程序(四)
2006/10/09 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php生成mysql的数据字典
2016/07/07 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
window.location不跳转的问题解决方法
2014/04/17 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
javascript实现放大镜功能
2020/12/09 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
python协程之动态添加任务的方法
2019/02/19 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
全球立体声:World Wide Stereo
2018/09/29 全球购物
自我评价是什么
2014/01/04 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
国际商务专业求职信
2014/07/15 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
艺术节开幕词
2015/01/28 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
民间借贷借条如何写
2015/05/26 职场文书
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers