判断数组的方法:
Object.prototype.toString.call(arr)
Object.prototype.toString.call(arr) === "[object Array]"
Object.prototype.toString.call(arr).slice(8,-1) === "Array"
这是目前兼容性最好的方法,在es6之前基本都是使用该方法,但有一定缺陷:
let obj = {}
console.log(Object.prototype.toString.call(obj));
obj[Symbol.toStringTag] = "Array"
console.log(Object.prototype.toString.call(obj));
代码结果:
通过结果可知,我们可以通过Symbol.toStringTag修改Object.prototype.toString() 的返回值,这样明明obj是一个空对象,结果打印出来的结果显然不准确的。不过这种情况一般不会遇到,平常开发还是可以正常使用的。
原型
arr.__proto__ == Array.prototype
arr instanceof Array
该方法有明显缺陷,那就是原型链容易被修改,从而导致该方法判断失误:
let obj = {}
console.log(obj instanceof Array);
obj.__proto__ =Array.prototype
console.log(obj instanceof Array);
代码结果:
Array.isArray
Array.isArray(arr)
该方法是es6新增的内置数组方法,它的实现原理是通过判断该对象是否是数组的数据结构,简单来说就是判断该对象是否是通过Array构造函数生成的,该方法无法通过js代码手写出来。
该方法简单且准确,但有一定的兼容性问题(基本可以忽略)