一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

js 判断一个变量是否为数组完美解决办法

时间:2014-11-10 编辑:简简单单 来源:一聚教程网

前端开发中,在做项目的时候,我们经常需要对一个变量进行数组类型的判断,当然即使你暂时没遇到,但是这个问题也是大家去面试时的高频问题,有必要拿出来说一说。

大家都知道js中可以使用typeof来判断变量的基本类型,如:

 代码如下 复制代码

alert(typeof '111'); // "string"
alert(typeof 22); // "number"
alert(typeof a); // "undefined"
alert(typeof undefined); // "undefined"
alert(typeof []); // "object"

但是这个方法不适用于来判断数组,因为不管是数组还是对象,都会返回object,这就需要我们需求其他的方法。

有三种方法可以拿来判断:

1、constructor属性

这个属性在我们使用js系统或者自己创建的对象的时候,会默认的加上,例如:

var arr = [1,2,3];  //创建一个数组对象
arr.prototype.constructor = Array;  //这一句是系统默认加上的

所以我们就可以这样来判断:

var arr = [1,2,3,1];
alert(arr.constructor === Array);   // true

2、instanceof

instanceof是检测对象的原型链是否指向构造函数的prototype对象的,所以我们也可以用它来判断:

var arr = [1,2,3];
alert(arr instanceof Array);   // true

3、使用toString方法

Object.prototype.toString是原型链的顶层object的一个方法,我们可以用它来判断:

var arr = [1,2,3];
alert(Object.prototype.toString.call(arr) === '[object Array]' );   // true

4.Array.isArray()方法

ECMAScript5将Array.isArray()正式引入JavaScript,从此我们又多了一个检测

数组的方法:

 代码如下 复制代码

var arr = [1,2,3];
alert(Array.isArray(arr) );   // true

注意点:讲完了上述四种方法,下面说一下注意事项,前两种方法使用的时候不太保险,因为在跨页面操作的时候,js里面的原型链是不对应的,所以前两种方法有一定的局限性,不过一般不会遇到。第四种方法因为是新出的,脑残的IE低版本当然是不支持的,在标准浏览器下无误。由此,最好的方法还是使用第三种方法。

最后,为了给大家一个结果,现写出一个终极解决方案:

判断数组终极解决方案

 

 代码如下 复制代码
var arr = [1,2,3];
function isArrayFn(obj){  //封装一个函数
if (typeof Array.isArray === "function") {
return Array.isArray(obj); //浏览器支持则使用isArray()方法
}else{                     //否则使用toString方法
return Object.prototype.toString.call(obj) === "[object Array]";
}
}
alert(isArrayFn(arr));// true

热门栏目