判断一个变量是数组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 相关文章推荐
picChange 图片切换特效的函数代码
May 06 Javascript
关于textarea提交的内容无法换行的解决办法
Apr 09 Javascript
jquery监听div内容的变化具体实现思路
Nov 04 Javascript
Bootstrap3制作搜索框样式的方法
Jul 11 Javascript
JS 数字转换为大写金额的简单实例
Aug 04 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
JS比较两个数值的大小实例
Nov 25 Javascript
Mint UI 基于 Vue.js 移动端组件库
Nov 07 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
Mar 10 Javascript
Vue的路由动态重定向和导航守卫实例
Mar 17 Javascript
jquery实现的简单轮播图功能【适合新手】
Aug 17 jQuery
vue-cli项目代理proxyTable配置exclude的方法
Sep 20 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 魔术方法使用说明
2009/10/20 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php实现socket推送技术的示例
2017/12/20 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
jQuery Ajax 全解析
2009/02/08 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
Python中关于使用模块的基础知识
2015/05/24 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
python新手学习可变和不可变对象
2020/06/11 Python
了解一下python内建模块collections
2020/09/07 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
学生打架检讨书大全
2014/01/23 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
骨干教师考核评语
2014/12/31 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
Python编写nmap扫描工具
2021/07/21 Python