最终解
// 声明const isArray =Array.isArray ||function (value) {return toString.call(value) === '[object Array]'}
// 使用isArray([])
1. (es2015) Array.isArray
- 字面意思,用于确定传递的值是否是一个 Array
- 当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测iframes,也即是跨框架传入的值,例如iframe里声明一个array,把它赋给父组件的变量,这种情况只有 Array.isArray 和
Object.prototype.toString.call(arg)=='[object Array]'能识别出来。 - 并且因为es2015的方法有兼容问题,建议这种和下一种结合使用,也即是上文给出的最终解:
// 声明const isArray =Array.isArray ||function (value) {return toString.call(value) === '[object Array]'}
2. Object.prototype.toString
var array = [1,23,4];function isArray(arg){return Object.prototype.toString.call(arg)=='[object Array]';}console.log(isArray(ary));
Object.prototype.toString的原理,可以看 https://www.yuque.com/docs/share/14edf536-37f3-419a-bd4b-6b3e9a775665?# 《Object.prototype.toString方法的原理 - 紫云飞 - 博客园》- 万能药解法
3. instanceof
var ary = [1,23,4];console.log(ary instanceof Array)//true;
- 在不会跨iframe赋值的情况下,最简单的写法
- 缺点在 「1」中有讲解
4. constructor
var array = [1,23,4];array.__proto__.constructor === Arrayarray.constructor === Array
- 缺点同3
