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 相关文章推荐
javascript 浏览器检测代码精简版
Mar 04 Javascript
js 3秒后跳转页面的实现代码
Mar 10 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
jQuery简单实现日历的方法
May 04 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 Javascript
vue params、query传参使用详解
Sep 12 Javascript
angular 实现下拉列表组件的示例代码
Mar 09 Javascript
微信公众平台获取access_token的方法步骤
Mar 29 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 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生成xml简单实例代码
2009/12/16 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
python保存字符串到文件的方法
2015/07/01 Python
浅谈python可视化包Bokeh
2018/02/07 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
经典c++面试题三
2015/07/08 面试题
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
英语演讲稿范文
2014/01/03 职场文书
小学生新学期寄语
2014/01/19 职场文书
写给老师的表扬信
2014/01/21 职场文书
2016新年感言
2015/08/03 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android