在 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。