在JavaScript中检查数组的3种方法

977 阅读3分钟

在JavaScript中检测一个数组的3种方法

当一个变量被期望是一个数组,但它可能是一个普通的对象甚至是一个基元时,在JavaScript中检查一个值是否是数组是必要的。

在这篇文章中,你会发现在JavaScript中检测一个数组实例的3种好方法。

1.Array.isArray(value)

如果你没有时间阅读整个帖子,这里有一个在JavaScript中检测数组的好方法:只需使用Array.isArray(value) 实用函数。

但如果你想了解更多,让我们继续。

下面是几个使用Array.isArray() 的例子。

const array = [1, 2, 3];
const object = { message: 'Hello!' };
const string = 'Hello!';
const empty = null;
Array.isArray(array);  // => true
Array.isArray(object); // => false
Array.isArray(string); // => false
Array.isArray(empty);  // => false

Array.isArray() 有一个很好的浏览器支持。这是在JavaScript中检测数组的推荐方法。

Array.isArray(value) utility函数如果value 是一个数组,则返回 true

2.value instanceof Array

一个数组是一个对象。和JavaScript中的任何对象一样,数组实例有一个构造函数--Array

Array 作为一个构造函数(前缀为 new关键字)被调用,可以创建数组实例。

const array = new Array(1, 2, 3);
array; // => [1, 2, 3]

此外,数组实例使用一个属性暴露了它的构造函数.constructor

const array = [1, 2, 3];
array.constructor === Array; // => true

验证一个函数是否是一个实例的构造函数的操作符是什么?instanceof!

value 现在出现了检测数组的下一个方法:如果value instanceof Array 是一个数组,则评估为true

让我们看几个例子:

const array = [1, 2, 3];
const object = { message: 'Hello!' };
const string = 'Hello!';
const empty = null;
array  instanceof Array; // => true
object instanceof Array; // => false
string instanceof Array; // => false
empty  instanceof Array; // => false

重新开始:

value instanceof Array 如果value 是一个数组,那么表达式就会被评估为true

注意:当value 是一个在不同的iframe中创建的数组时,value instanceof Array 评估为false ,而不是Array 构造函数。如果你不是在写跨框架的JavaScript,可以放心使用这种方法。

3.({}).toString.call(value)

toString() 方法返回 ,其中 是它被调用的对象类型。看一下'[object <type>]' <type> 规范,它指出了 具体是如何工作的。Object.prototype.toString()

在最简单的情况下,当toString() 方法被直接调用到一个普通对象上时,它返回'[object Object]'

({}).toString(); // => '[object Object]'

然而,你可以在不同类型的值上间接调用 toString() ,该方法会返回该类型的相应字符串表示。

const array = [1, 2, 3];
const object = { message: 'Hello' };
const string = 'Hello!';
const empty = null;
({}).toString.call(array);   // => '[object Array]'
({}).toString.call(object);  // => '[object Object]'
({}).toString.call(string);  // => '[object String]'
({}).toString.call(empty);   // => '[object Null]'

现在你可以发现这个想法:如果value 是一个数组,({}).toString.call(value) 等于'[object Array]'

const array = [1, 2, 3];
({}).toString.call(array) === '[object Array]'; // => true

4.4.总结

要检测一个数组,我的建议是使用Array.isArray(value) 。该函数返回一个布尔值,说明value 是否是一个数组。就像现在这样简单。

另一种方法是value instanceof Array 表达式,如果value 是一个数组,它就会评估为true 。这种方法使用了这样的想法:Array 函数是数组的构造器。

最后,不是最美观的方法是使用表达式({}).toString.call(value) === '[object Array]' ,如果value 是一个数组,那么它就是true

Object.prototype.toString() 返回它所调用的对象的类型表示,而数组的类型表示是 '[object Array]'