前言:判断数组的方法有很多,但是最完美的只有一个。
1. Object.prototype.toString.call
通过 toString.call 方法来判断是否数组。
function isArray(obj) { return Object.prototype.toString.call(obj) === "[object Array]"; }
缺点:ES6 提供了一个知名符号[Symbol.toStringTag],可以指定 toString.call 的调用行文,再用这种方法就不准确了。
const obj = { [Symbol.toStringTag]: "abc", }; Object.prototype.toString.call(obj); // [object abc]
2. instanceof
通过 instanceof 判断原型链。
function isArray(obj) { return obj instanceof Array; }
缺点:可以通过 Object.setPrototypeOf 改变原型链的指向。
let obj = {}; Object.setPrototypeOf(obj, Array.prototype); isArray({});
3. Array.isArray
ES6 提供的最完美的判断数组方法,底层是 C++代码。无法随意篡改。
function isArray(obj) { return Array.isArray(obj); }