instanceOf操作符
对于一个网页, 或者一个全局作用域而言,使用 instanceof 操作符就能检测是不是一个数组:
if (value instanceof Array){
//对数组执行某些操作
};
// instanceof 操作符的问题在于,它假定只有一个全局执行环境。
// 如果网页中包含多个框架,那实 际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。
// 如果你从 一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自 不同的构造函数。
ES6 原生方法
为了解决instanceof存在的问题,ECMAScript 5 新增了 Array.isArray()方法。这个方法的目的是最终确定某 个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。这个方法的用法如下:
if ( Array.isArray(value) ){
//对数组执行某些操作
};
// 支持 Array.isArray()方法的浏览器有 IE9+、Firefox 4+、Safari 5+、Opera 10.5+和 Chrome。
原生JS实现 – 数组检测
在尚未实现这个方法中的浏览器中准确检测数组,封装如下方法:
/*
功能:判断是不是数组
参数:Array || Object
思路:
1.先把函数和window以及非对象排除掉(因为函数和window都有一个length属性)
2.然后通过toString来判断是不是真数组(typeof判断数组的结果为object)
*/
isArray(arr){
// 先把函数和window以及非对象排除掉
if( hao.isFn(arr) || hao.isWindow(arr) || !hao.isObj(arr) ){
return false;
};
// 判断是否存在原生的isArray方法
if( typeof Array.isArray === 'function' ){
return Array.isArray(arr);
}else{
// 如果不存在使用以下方法检测是不是数组
return Object.prototype.toString.call(arr) === '[object Array]';
};
};
原生JS实现 – 伪数组检测
/*
功能:判断是不是伪数组
参数:Array || Object
思路:
1.先把函数和window以及非对象排除掉(因为函数和window都有一个length属性)
2.先看看这个对象有没有length属性
3.如果有,看看length值是不是为0,如果为0,是伪数组
4.如果length的值不为0,看看这个数据有没有length-1这个属性存在,如果存在,是伪数组
*/
isLikeArr(arr){
// 先把函数和window以及非对象排除掉
if( hao.isFn(arr) || hao.isWindow(arr) || !hao.isObj(arr) ){
return false;
};
/*
判断是不是伪数组:
用in操作符判断arr有没有length属性
arr.length - 1 in arr: 判断arr中有没有属性名为arr.length - 1的属性
*/
if( 'length' in arr && (arr.length === 0 || (arr.length - 1 in arr) )){
return true;
}
}