判断一个变量是数组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 相关文章推荐
Javascript 网页水印(非图片水印)实现代码
Mar 01 Javascript
javascript dom代码应用 简单的相册[firefox only]
Jun 12 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
Jun 06 Javascript
javascript适合移动端的日期时间拾取器
Nov 10 Javascript
原生js和css实现图片轮播效果
Feb 07 Javascript
VUE开发一个图片轮播的组件示例代码
Mar 06 Javascript
AngularJs 终极购物车(实例讲解)
Nov 08 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
node.js express框架简介与实现
Jul 23 Javascript
JS插入排序简单理解与实现方法分析
Nov 25 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 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/07/07 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
php从字符串创建函数的方法
2015/03/16 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
php实现websocket实时消息推送
2018/03/30 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Django框架视图函数设计示例
2019/07/29 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
高中毕业自我鉴定
2013/12/16 职场文书
毕业论文评语大全
2014/04/29 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
运动会观后感
2015/06/09 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫