No.1
首推Object.prototype.toString.call(obj)。获取对象的类型,返回[object type] ,注意是小写object
var arr = []
console.log(Object.prototype.toString.call(arr) === '[object Array]');
//true
//不知道你有没有疑惑,Array的原型链上不是也有toString方法,为什么非得用Object家的
//简单来说就是,如果Array没有对toString方法重写,它也会返回[object type],但是它被重写了,结果被用作转化为字符串
//想详细了解这一块,可访问https://blog.csdn.net/hanyanshuo/article/details/104620122
No.2
再推Array.isArray(obj),判断obj是否为数组,返回一个布尔值
var arr = []
console.log(Array.isArray(arr));
//true
//这个没什么好说的,主要就是考虑兼容性问题,是ES6语法
No.3
瞅瞅instanceof和constructor呗
//instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上,返回布尔值
var arr = []
console.log(arr instanceof Array);
//即判断arr的原型链上是否存在Array.prototype,返回的是true
//利用了实例的构造函数属性constructor指向构造函数
var arr = []
console.log(arr.constructor === Array);
//true
上面两种方式存有隐患:
使用时需保证arr是由原始Array构造函数创建的。 主要考虑iframe会产生新的全局环境,而在不同环境下比较同一个属性是极不合理的。(具体详情,查看MDN,一看就懂,此处不赘述)
No.4
最不该用typeof
//typeof 操作符返回一个字符串,表示未经计算的操作数的类型
//对于Function、String、Number、Undefined等几种类型的对象来说,他完全可以胜任
//但是判断Array时,就不能如我们所愿了...
var arr = []
console.log(typeof arr);
//object