一、通过instanceof判断:返回一个布尔值 let a 1 2 3 4 5 6 7 8 9 10 <!-- more --> `` `java let a = []; a instanceof Array; //true let b = {}; b instanceof Array; //false
instanceof 运算符检测Array.prototype 属性是否存在于变量a的原型链上,显然变量a是一个数组,拥有 属性,所以为true
存在问题:
prototype 属性是可以修改的,所以并不是最初判断为 就一定永远为真。 当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象, 的验证结果可能不会符合预期,例如:
1 2 3 4 5 6 7 8 9 var iframe = document .createElement ('iframe' );document .body .appendChild (iframe);xArray = window .frames [0 ].Array ; var arr = new xArray (1 ,2 ,3 ); arr instanceof Array ;
导致这种问题是因为```text iframe会产生新的全局环境,它也会拥有自己的```text Array.prototype
1 2 3 属性,让不同环境下的属性相同很明显是不安全的做法 所以 Array.prototype !== window.frames[0].Array.prototype
,想要
arr instanceof Array为
,须保证
arr为原始
Array构造函数创建才可行。
实例的构造函数属性constructor 指向构造函数,通过 属性也可以判断是否为一个数组。
1 2 let a = [1 ,3 ,4 ]; a.constructor === Array ;
这种判断也会存在多个全局环境的问题,导致的问题与```text instanceof相同。```java
1 2 3 xArray = window .frames [window .frames .length -1 ].Array ; arr.constructor === Array ;
可以获取到对象的不同类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //检验是否为数组 let a = [1,2,3] Object.prototype.toString.call(a) === '[object Array]';//true //检验是否是函数 let b = function () {}; Object.prototype.toString.call(b) === '[object Function]';//true //检验是否是数字 let c = 1; Object.prototype.toString.call(c) === '[object Number]';//true //检验是否为对象 let d = {}; Object.prototype.toString.call(d) === '[object Object]' //true `对于多全局环境时,```java Object.prototype.toString().call() `也能符合预期处理判断。```java console.log(Object.prototype.toString.call(arr) === '[object Array]');//true ``` `Array.isArray()` 用于确定传递的值是否是一个数组,返回一个布尔值。
Array.isArray(a);//true
Array.isArray()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ``` 同样能准确判断, Array.isArray() 是在ES5中提出,可能会存在ES5之前不支持此方法的情况 解决方法: 配合 `Object.prototype.toString().call()` 进行封装 ```javascript ```javascript function arg){ if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]';
};
从ES5新增isArray()方法正是为了提供一个稳定可用的数组判断方法
对于ES5之前不支持此方法的问题,我们可以做好兼容进行自行封装
本文标题: JavaScript如何判断是否是数组
发布时间: 2019年04月04日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/32ce9310/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!