一、typeof运算符判断
对于js的数据类型判断,一般都会用typeof运算符,但是typeof运算符判断数组的结果是'object',这是因为数组本质上是一个对象,它的每个元素都有自己的属性名(索引值),但数组拥有的方法和属性,普通对象并没有,因此这种方法并不靠谱。
let arr = [1, 2, 3]; console.log(typeof arr); // 'object'
二、Array.isArray()方法判断
Array.isArray()方法的作用就是判断某个值是否为数组,它是ES5中新增加的方法,因此在ES5以下的版本中无法使用。它的使用非常简单,就是直接调用这个方法,如果是数组则返回true,否则返回false。
let arr = [1, 2, 3]; console.log(Array.isArray(arr)); // true
需要注意的是,Array.isArray()方法虽然简单方便,但是一定要注意是使用它而不是typeof运算符进行判断。
三、instanceof运算符判断
instanceof运算符也可以用来判断某个值是否为数组,它的原理是通过判断某个实例是否是某个构造函数的实例。因为数组是Object的实例,并且数组的原型链中还有Array这个构造函数,所以可以使用instanceof来判断。
let arr = [1, 2, 3]; console.log(arr instanceof Array); // true
四、Object.prototype.toString.call()方法判断
Object.prototype.toString.call方法虽然麻烦一些,但是它是最为准确的一种方法。因为所有的对象在调用Object.prototype.toString方法的时候都会返回"[object Object]",但是对于数组来说,调用toString方法会返回"[object Array]",因此我们可以通过这种方式来判断某个值是否为数组。
let arr = [1, 2, 3]; console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true
五、总结
对数组判断,推荐使用Array.isArray()或Object.prototype.toString.call()方法来进行判断。而typeof运算符和instanceof运算符用来判断数据类型的时候,则不适合判断数组。