判断一个变量是数组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 相关文章推荐
function foo的原型与prototype属性解惑
Nov 19 Javascript
javascript时区函数介绍
Sep 14 Javascript
JavaScript中setAttribute用法介绍
Jul 20 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
关于javaScript注册click事件传递参数的不成功问题
Jul 18 Javascript
webpack配置导致字体图标无法显示的解决方法
Mar 06 Javascript
JS中this的指向以及call、apply的作用
May 06 Javascript
js/jQuery实现全选效果
Jun 17 jQuery
js数据类型转换与流程控制操作实例分析
Dec 18 Javascript
js实现自定义右键菜单
May 18 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
Jun 03 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设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
JavaScript URL参数读取改进版
2009/01/16 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
javascript常用的设计模式
2017/02/09 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
简单介绍Ruby中的CGI编程
2015/04/10 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
python 统计代码行数简单实例
2017/05/04 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
python实现控制COM口的示例
2019/07/03 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
优秀演讲稿范文
2013/12/29 职场文书
趣味游戏活动方案
2014/02/07 职场文书
个人四风问题整改措施
2014/10/24 职场文书
走进科学观后感
2015/06/18 职场文书
python实现双链表
2022/05/25 Python