本文详细解析JavaScript中判断变量是否为数组的四种常用方法:typeof、instanceof、原型链constructor以及通用的Object.prototype.toString。重点分析了前三种方法在跨iframe场景下的局限性,并推荐Object.prototype.toString作为最可靠的判断方案。
本文整理了JavaScript中判断变量是否为数组(Array)的相关知识,主要通过以下四个方面展开介绍。
typeof运算符检测
1. typeof运算符检测
//首先看代码
var ary = [1,23,4];
console.log(typeof ary); //输出结果是Object
上述方法无法实时检测变量是否为数组,仅能判断其类型。因此,typeof适合判断基本数据类型,但不能准确测试是否为数组(typeof的具体用法后续提及,此处回归正题)。
instanceof运算符判断
2. instanceof运算符判断
var ary = [1,23,4];
console.log(ary instanceof Array)//true;
从输出效果看,该方法能准确检测数据类型是否为数组。但需注意其潜在缺点,接下来介绍第三种方法。
原型链方法
3. 原型链方法
var ary = [1,23,4];
console.log(ary.__proto__.constructor==Array);//true
console.log(ary.constructor==Array)//true 这两段代码是一样的
该方法看似高级,利用了原型链特性,但存在兼容性问题。在IE早期版本中,__proto__属性未定义。此外,该方法仍有局限性,下文将总结第二种和第三种方法的局限。
前两种方法的局限性
总结第二种和第三种方法的局限性
使用instanceof和constructor判断的变量,必须在当前页面声明。例如,父页面包含一个框架,框架引用了一个子页面。若在子页面中声明数组ary并赋值给父页面的变量,此时判断Array == object.constructor将返回false。
原因分析:
1. array属于引用型数据,传递过程中仅传递引用地址。
2. 每个页面的Array原生对象引用的地址不同。在子页面声明的array,其对应的构造函数是子页面的Array对象;父页面进行判断时使用的Array不等于子页面的Array。需注意此问题,否则难以排查。
通用判断方法
4. 通用判断方法
var ary = [1,23,4];
function isArray(o){
return Object.prototype.toString.call(o)=='[object Array]';
}
console.log(isArray(ary));
关于Object.prototype.toString的具体用法,请参考相关文档。
关于JavaScript判断变量是否为数组的方法就介绍到这里。本文主要总结了这四种方法,如有不足之处,欢迎指正。