langliu1216@gmail.com

在 JavaScript 中如何判断一个数组是数组? - 2022/03/11

近日被问到一个问题:在 JavaScript 中如何判断一个数组是数组?。在听到这个问题的时候我就在想有那些方式,在我们常用的类型判断中可以通过 `typeof` 或 `instanceof` 来进行类型判断。

其中 typeof 返回值固定,只有以下几种情况:

类型结果
Undefined”undefined”
Null”object” (见下文)
Boolean”boolean”
Number”number”
BigInt(ECMAScript 2020 新增)“bigint”
String”string”
Symbol (ECMAScript 2015 新增)“symbol”
宿主对象(由 JS 环境提供)取决于具体实现
Function 对象 (按照 ECMA-262 规范实现 [[Call]])“function”
其他任何对象”object”

所以通过 typeof 来判断肯定是不可行的,那么就只能通过 instanceof 进行判断?

用 Array 对象的 isArray 方法判断

Array.isArray() | MDN 是 JavaScript 原生提供的判断数组的方法,从 ES5 就能使用,但是因为之前没有用到过所以不记得有这个方法(尴尬 😅)。

使用 instanceof 进行判断可能会出现的问题

因为 instanceof 是用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,在 JavaScript 中原型链是可以进行更改的,所以一旦变量的原型发生了更改的话这种判断就会失效,故而使用 Array.isArray() 是最稳妥的方式。

const s = []
s.__proto__ = Object.prototype // 如果更改了变量的原型指向的话判断可能就不靠谱了
console.log(s.__proto__ === Array.prototype) // false
console.log(Object.getPrototypeOf(s) === Array.prototype) // false