在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]'