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