js判断一个变量是否是数组
(1)通用方法
Object.prototype.toString.call();获取对象类型
[code]var a=[1,2,3,4]; function isArray(arr){ return Object.prototype.toString.call(arr) === '[object Array]'; } console.log(isArray(a));//true //检验函数 Object.prototype.toString.call(functionName) === '[object Function]'; //检验数字 Object.prototype.toString.call(num) === '[object Number]';
(2)通过instanceof判断
instanceof运算符用于检验构造函数的prototype属性是否出现在对象的原型链中的任何位置,返回一个布尔值。
[code]var a=[1,2,3,4]; console.log(a instanceof Array);//true
instanceof运算符检测Array.prototype属性是否存在于变量a的原型链上,显然a是一个数组,拥有Array.prototype属性。
存在问题:当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象,instanceof的验证结果可能不会符合预期。
(3)通过constructor判断(原型链方法)
实例的构造函数属性constructor指向构造函数,那么通过constructor属性也可以判断是否为一个数组
[code]var a = [1,2,3,4]; a.constructor === Array;//true a.__proto__.constructor === Array; //true 与上一句相同
存在问题:也会存在多个全局环境的问题,导致的问题与instanceof相同。在IE早期版本里面__proto__是没有定义的。
第2种方法和第3种方法局限性:
instanceof 和constructor 判断的变量,必须在当前页面声明的,比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor,会返回false。原因: 1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array。
[code]//为body创建并添加一个iframe对象 var iframe = document.createElement('iframe'); document.body.appendChild(iframe); //取得iframe对象的构造数组方法 xArray = window.frames[0].Array; //通过构造函数获取一个实例 var arr = new xArray(1,2,3); arr instanceof Array;//false arr.constructor === Array;//false
导致这种问题是因为iframe会产生新的全局环境,它也会拥有自己的Array.prototype属性,让不同环境下的属性相同很明显是不安全的做法,所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array为true,你得保证arr是由原始Array构造函数创建时才可行。
(4)通过Array.isArray()判断
[code]var a = [1,2,3,4]; Array.isArray(a);//true
Array.isArray() 是在ES5中提出,而对于ES5之前不支持此方法的问题,我们其实可以做好兼容进行自行封装。
[code]if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }
(5)typeof 不可以
[code]var a = [1,2,3,4]; console.log(typeof a);//输出结果是Object
(参考文章:https://www.cnblogs.com/echolun/p/10287616.html和https://www.cnblogs.com/ysk123/p/9995920.html)
- 点赞
- 收藏
- 分享
- 文章举报
- js中判断一个变量是否是数组
- JS 判断某变量是否为某数组中的一个值 的几种方法
- js判断一个变量是否为数组的解决方案
- js javascript 判断一个变量是否在一个数组中
- JS 判断某变量是否为某数组中的一个值的3种方法(总结)
- JS如何判断一个变量是否为数组类型
- js如何判断一个变量是否是数组?
- JS判断某变量是否为某数组中的一个值的3种方法
- 判断一个变量是否是数组
- js如何判断一个数组中是否有重复的值
- JS判断一个数组中是否有重复值的三种方法 .
- JS 判断一个数组是否包含某个值
- JS判断一个数组中是否有重复值的三种方法
- 编写js扩展方法判断一个数组中是否包含某个元素
- JS判断一个数组中是否有重复值的三种方法来自
- JS判断一个数组中是否有重复值的三种方法
- 如何在前端用js判断一个元素在一个数组中是否存在
- 判断一个变量是否属于数组类型
- JS判断一个值是否在数组中
- thinkphp模板里面判断一个变量是否存在于一个数组中 相当于in_array() in 或range 标签