判断一个变量是数组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 调用本地exe的例子(支持IE内核的浏览器)
Dec 26 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
jquery实现select选择框内容左右移动代码分享
Nov 21 Javascript
jQuery与Ajax以及序列化
Feb 01 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
Oct 27 Javascript
BootStrap表单宽度设置方法
Mar 10 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
May 11 Javascript
Vue实现todolist删除功能
Jun 26 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
May 27 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
Jun 20 Javascript
基于vue 动态菜单 刷新空白问题的解决
Aug 06 Javascript
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
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中替换换行符的几种方法小结
2012/10/15 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
vue实现树形菜单效果
2018/03/19 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
泛谈JS逻辑判断选择器 || &&
2019/05/24 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
vue实现分页加载效果
2019/12/24 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
为什么称python为胶水语言
2020/06/16 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
夜大毕业生自我评价分享
2013/11/10 职场文书
法律六进活动方案
2014/03/13 职场文书
股东出资协议书
2016/03/21 职场文书
Golang: 内建容器的用法
2021/05/05 Golang