JavaScript 如何判断数组

在日常写代码时,我们经常会遇到需要判断一个变量是不是数组的场景,比如从接口拿到数据后,得先确认它是数组才能用数组的遍历方法处理,不然直接调用map或者forEach就会报错。很多新手刚接触JavaScript时,会误以为用typeof就能判断数组,结果踩了大坑,今天就来好好说说怎么正确判断数组。

为什么`typeof`判断数组会出错?

先回忆下typeof的用法:如果是数字返回number,字符串返回string,布尔值返回boolean,普通对象返回object。但数组在JavaScript里本质是特殊的对象,所以用typeof判断数组时,结果会是object,根本没法和普通对象区分开。比如你写typeof [1,2,3],输出的是object,而typeof {name:"小明"}也是object,这就乱套了,所以typeof根本不能用来判断数组。

JavaScript 如何判断数组

最常用:`Array.isArray()`方法

ES5(也就是JavaScript的第五版标准)给数组专门加了一个静态方法Array.isArray(),这个方法就是专门用来判断一个值是不是数组的,而且兼容性也很好,现在所有主流浏览器都支持。举个生活化的例子:你把“苹果”、“香蕉”、“橘子”放进一个购物袋里,Array.isArray就相当于一个“购物袋验证器”,只要是装水果的数组购物袋,它就会返回true,要是普通的纸袋子或者空盒子,就返回false。

比如代码里写:

`javascript

console.log(Array.isArray([1,2,3])); // 输出true,确实是数组

console.log(Array.isArray({name:"小明"})); // 输出false,是普通对象

console.log(Array.isArray("不是数组哦")); // 输出false,是字符串

`

这个方法简单直接,是判断数组的首选,几乎没有缺点,只要你用的不是特别老的浏览器(比如IE8及更早,不过现在项目里基本不用这些旧浏览器了),放心用就好。

兼容旧环境:`instanceof`运算符

如果项目里需要兼容IE8这种老式浏览器,Array.isArray用不了,那可以用instanceof。instanceof的逻辑是:判断某个实例是不是某个构造函数的实例。数组是由Array构造出来的,所以数组变量 instanceof Array,返回true就是数组,反之不是。

还是用购物袋举例:instanceof就相当于拿着“水果袋模板”去比对,只要是用这个模板做的袋子,就符合要求。比如:

`javascript

const arr = [1,2,3];

console.log(arr instanceof Array); // 输出true

const obj = {name:"小明"};

console.log(obj instanceof Array); // 输出false

`

不过instanceof有个小问题:如果页面里有多个框架(比如用了iframe),每个框架都有自己的Array构造函数,这时候跨框架的数组用instanceof判断,就会返回false,比如在iframe里创建的数组,在父页面用instanceof Array判断就不对,这时候还是Array.isArray更靠谱。

冷门但好用:`Object.prototype.toString.call()`

如果要兼容更极端的旧环境,比如IE6这种古董级浏览器,Object.prototype.toString这个“万能类型验证工具”就能派上用场。它的原理是:每个JavaScript内置类型都有对应的toString返回值,数组的返回值是[object Array],普通对象是[object Object],字符串是[object String],所以只要把要判断的值传给这个方法,看返回值是不是[object Array]就行。

生活化的例子:相当于你拿一个“物品标签读取器”,把要检查的东西放上去,它会读出标签上的内容,标签是“Array”就是数组,其他都不是。代码里这样写:

`javascript

console.log(Object.prototype.toString.call([1,2,3]) === "[object Array]"); // true

console.log(Object.prototype.toString.call({name:"小明"}) === "[object Array]"); // false

`

这个方法兼容性极强,从JavaScript诞生起就有,几乎所有环境都能用,就是写法比前两个稍微复杂一点。

总结一下,判断数组的方法优先级是:优先用Array.isArray(),简单直接;如果要兼容旧环境,用instanceof;碰到跨框架或更老的环境,用Object.prototype.toString.call()。以后再遇到要判断数组的场景,就不会再踩坑啦。

上一篇 Java List 怎么用