一、通过instanceof判断:返回一个布尔值 let a = []; a instanceof Array; //true let b = {}; b instanceof Array; //false instanceof运算符检测Array.prototype属性是否存在于变量a的原型…
1 | let a = []; |
1 | instanceof |
运算符检测
1 | Array.prototype |
属性是否存在于变量a的原型链上,显然变量a是一个数组,拥有
1 | Array.prototype |
属性,所以为
1 | true |
存在问题:
1 | prototype |
属性是可以修改的,所以并不是最初判断为
1 | true |
就一定永远为真。
当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象,
1 | instanceof |
的验证结果可能不会符合预期,例如:
1 | //为body创建并添加一个iframe对象 |
导致这种问题是因为
1 | iframe |
会产生新的全局环境,它也会拥有自己的
1 | Array.prototype |
属性,让不同环境下的属性相同很明显是不安全的做法
所以
1 | Array.prototype !== window.frames[0].Array.prototype |
,想要
1 | arr instanceof Array |
为
1 | true |
,须保证
1 | arr |
为原始
1 | Array |
构造函数创建才可行。
实例的构造函数属性
1 | constructor |
指向构造函数,通过
1 | constructor |
属性也可以判断是否为一个数组。
1 | let a = [1,3,4]; |
这种判断也会存在多个全局环境的问题,导致的问题与
1 | instanceof |
相同。
1 | //为body创建并添加一个iframe标签 |
1 | Object.prototype.toString().call() |
可以获取到对象的不同类型
1 | //检验是否为数组 |
对于多全局环境时,
1 | Object.prototype.toString().call() |
也能符合预期处理判断。
1 | //为body创建并添加一个iframe标签 |
1 | Array.isArray() |
用于确定传递的值是否是一个数组,返回一个布尔值。
1 | let a = [1,2,3] |
简单好用,且对于多全局环境,
1 | Array.isArray() |
同样能准确判断,
Array.isArray() 是在ES5中提出,可能会存在ES5之前不支持此方法的情况
解决方法:
配合
1 | Object.prototype.toString().call() |
进行封装
1 | function checkArray(arg){ |
从ES5新增isArray()方法正是为了提供一个稳定可用的数组判断方法
对于ES5之前不支持此方法的问题,我们可以做好兼容进行自行封装
本文标题: Javascript如何判断是否是数组的四种方法-
本文作者: OSChina
发布时间: 2021年04月15日 09:48
最后更新: 2025年04月03日 11:07
原始链接: https://haoxiang.eu.org/188f734f/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!