判断一个变量是数组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 版本自动生成文章摘要
Jul 23 Javascript
javascript setTimeout和setInterval 的区别
Dec 08 Javascript
12个非常有创意的JavaScript小游戏
Mar 18 Javascript
关于eval 与new Function 到底该选哪个?
Apr 17 Javascript
基于Jquery easyui 选中特定的tab
Nov 17 Javascript
ES6新特性八:async函数用法实例详解
Apr 21 Javascript
vue项目开发中setTimeout等定时器的管理问题
Sep 13 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
Oct 27 Javascript
JS实现前端路由功能示例【原生路由】
May 29 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 29 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
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
Sony CFR 320 修复改造
2020/03/14 无线电
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
PHP开发中四种查询返回结果分析
2011/01/02 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php实现微信发红包
2015/12/05 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
Django开发中的日志输出的方法
2018/07/02 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
java判断三位数的实例讲解
2019/06/10 Python
python字典改变value值方法总结
2019/06/21 Python
python打包成so文件过程解析
2019/09/28 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
数学教研活动总结
2014/07/02 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
思想政治表现评语
2015/01/04 职场文书
财务总监岗位职责
2015/02/03 职场文书
寒假致家长的一封信
2015/10/10 职场文书