JS判断数组的方式

135 阅读1分钟

最正确方案

function isArray(obj) {
    return Array.isArray(obj)
}

console.log(Array.isArray)
// ƒ isArray() { [native code] }

是通过底层C++判断的,js环境中数组是通过特殊的构造函数创建的,Array.isArray是通过判断是否是通过这个构造函数来创建的数组对象

老方案1(toString判断)

function isArray(obj) {
    return Object.prototype,toString.call(obj) === '[object Array]'
}

缺陷:es6之后Object.prototype,toString可以被指定

const obj = {
    [Symbol.toStringTag]: 'abc'
}
console.log(Object.prototype,toString.call(obj))
// '[object abc]'

老方案2(原型链判断)

function isArray(obj) {
    return obj instanceof Array
}

缺陷1:原型链可能被修改

const obj = {}
Object.setPrototypeOf(obj, Array.prototype)

console.log(obj instanceof Array)
// true

缺陷2:页面中存在框架页(iframe) 页面中存在多个Array原型,如特殊情况下需要主页面的方法判断子页面的obj是否为Array会出错

老六方案(序列化)

function isArray(obj) {
    return JSON.stringify(obj).startsWith('[')
}

序列化这一步的时候就可能会报错