判断一个变量是数组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 相关文章推荐
对YUI扩展的Gird组件 Part-2
Mar 10 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
May 28 Javascript
js克隆对象、数组的常用方法介绍
Sep 26 Javascript
JavaScript 数组详解
Oct 10 Javascript
JavaScript简单实现网页回到顶部功能
Nov 12 Javascript
jQuery实现图片走马灯效果的原理分析
Jan 16 Javascript
jquery select2的使用心得(推荐)
Dec 04 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
vue 源码解析之虚拟Dom-render
Aug 26 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
Sep 11 Javascript
openlayers实现地图弹窗
Sep 25 Javascript
ES6学习教程之Promise用法详解
Nov 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
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
python:接口间数据传递与调用方法
2018/12/17 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
Python转换时间的图文方法
2019/07/01 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
python3代码中实现加法重载的实例
2020/12/03 Python
python简单实现插入排序实例代码
2020/12/16 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
《金子》教学反思
2014/04/13 职场文书
医药销售自我评价200字
2014/09/11 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书