其中 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