判断一个变量是数组Array类型的方法


Posted in Javascript onSeptember 16, 2013

在很多时候,我们都需要对一个变量进行数组类型的判断。JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助。

JavaScript中检测对象的方法
1.typeof操作符
这种方法对于一些常用的类型来说那算是毫无压力,比如Function、String、Number、Undefined等,但是要是检测Array的对象就不起作用了。

alert(typeof null); // "object" 
alert(typeof function () { 
return 1; 
}); // "function" 
alert(typeof '梦龙小站'); // "string" 
alert(typeof 1); // "number" 
alert(typeof a); // "undefined" 
alert(typeof undefined); // "undefined" 
alert(typeof []); // "object"

2.instanceof操作符
这个操作符和JavaScript中面向对象有点关系,了解这个就先得了解JavaScript中的面向对象。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。
var arr = [1,2,3,1];
alert(arr instanceof Array); // true
3.对象的constructor属性
除了instanceof,每个对象还有constructor的属性,利用它似乎也能进行Array的判断。
var arr = [1,2,3,1]; 
alert(arr.constructor === Array); // true

第2种和第3种方法貌似无懈可击,但是实际上还是有些漏洞的,当你在多个frame中来回穿梭的时候,这两种方法就亚历山大了。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效!
var iframe = document.createElement('iframe'); //创建iframe 
document.body.appendChild(iframe); //添加到body中 
xArray = window.frames[window.frames.length-1].Array; 
var arr = new xArray(1,2,3); // 声明数组[1,2,3] 
alert(arr instanceof Array); // false 
alert(arr.constructor === Array); // false

检测数组类型方法
以上那些方法看上去无懈可击,但是终究会有些问题,接下来向大家提供一些比较不错的方法,可以说是无懈可击了。
1.Object.prototype.toString
Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这 个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。
function isArrayFn (o) { 
return Object.prototype.toString.call(o) === '[object Array]'; 
} 
var arr = [1,2,3,1]; 
alert(isArrayFn(arr));// true

call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有 toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)

JavaScript 标准文档中定义: [[Class]] 的值只可能是下面字符串中的一个: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String.
这种方法在识别内置对象时往往十分有用,但对于自定义对象请不要使用这种方法。
2.Array.isArray()
ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、 Firefox 4+、Safari 5+、Opera 10.5+和Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。
3.较好参考
综合上面的几种方法,有一个当前的判断数组的最佳写法:

var arr = [1,2,3,1]; 
var arr2 = [{ abac : 1, abc : 2 }]; 
function isArrayFn(value){ 
if (typeof Array.isArray === "function") { 
return Array.isArray(value); 
}else{ 
return Object.prototype.toString.call(value) === "[object Array]"; 
} 
} 
alert(isArrayFn(arr));// true 
alert(isArrayFn(arr2));// true

JavaScript中如何判断一个变量是数组Array类型呢?以上便是我为大家分享的JavaScript中判断一个变量是数组Array类型的方法,希望能对大家有所帮助。
Javascript 相关文章推荐
犀利的js 函数集合
Jun 11 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
Jun 22 Javascript
JavaScript使用focus()设置焦点失败的解决方法
Sep 03 Javascript
全面解析Bootstrap中form、navbar的使用方法
May 30 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
Jul 28 Javascript
微信小程序 Image API实例详解
Sep 30 Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
Jul 04 Javascript
Postman的下载及安装教程详解
Oct 16 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
Sep 19 Javascript
针对Vue路由history模式下Nginx后台配置操作
Oct 22 Javascript
jquery实现div阴影效果示例代码
Sep 16 #Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
Sep 16 #Javascript
document.documentElement和document.body区别介绍
Sep 16 #Javascript
使用js在页面中绘制表格核心代码
Sep 16 #Javascript
Function.prototype.bind用法示例
Sep 16 #Javascript
javascript简单事件处理和with用法介绍
Sep 16 #Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
Sep 16 #Javascript
You might like
Dedecms常用函数解析
2008/02/01 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
php微信开发之图片回复功能
2018/06/14 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
python的类变量和成员变量用法实例教程
2014/08/25 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python selenium如何设置等待时间
2016/09/15 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
python实现kNN算法
2017/12/20 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
蒂娜商店:Tiina the Store
2019/12/07 全球购物
加工操作管理制度
2014/01/19 职场文书
大学班级学风建设方案
2014/05/01 职场文书
卖房授权委托书样本
2014/10/05 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
交通事故案件代理词
2015/05/23 职场文书