更好的检查数组之Array.isArray篇

在 javascript 中,数组不是真正的数组,它本质上是对象。所以不能简单地使用 typeof 进行检查,因为它的返回结果为 ‘object’。

那么如何检查一个值是不是真正的数组,有一种更简单的方法,就用到了今天要说的 Array.isArray() 方法。 示例如下: 检查数组

const colors = ['red','yellow','blue'];
// 传统的老方法
Object.prototype.toString.call(colors) === '[object Array]';
// 更好的新方法
Array.isArray(colors);

Array.isArray() 示例

接下来,让我们试试用它判断一下其他类型的值,看看会得到什么样的结果。

以下均为真正的数组,返回结果为 true

// Empty Array
Array.isArray([]); // true

// Array
Array.isArray(['books']); // true

// Array Constructor
Array.isArray(new Array(['books'])); // true

以下并非真正的数组,返回结果为 false

// Object
Array.isArray({}); // false

// Object
Array.isArray({book:'math'});// false

// Number
Array.isArray(123); // false

// Boolean
Array.isArray(true); // false

// Boolean
Array.isArray(false); // false

// String
Array.isArray('jerrychane'); // false

// null
Array.isArray(null); // false

// undefined
Array.isArray(undefined); // false

// NaN
Array.isArray(NaN); // false

instanceof vs Array.isArray()

另一个使用比较多的方式是 instanceof,如下示例:

const colors = ['red','yellow','blue'];
colors instanceof Array; // true

但是,该方法存在的最大的问题是,instanceof 本质上通过检测构函数的 prototype 属性是否出现某个实例对象的原型链上。如果表达式 colors instanceof Array 返回 true,并不意味着该表达式会永远返回 true,因为 Array.prototype 属性的值可能发生会改变,改变后的值可能不存在于 Array 的原型链上,这时原表达式的值就会成为 false。