最正确方案
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('[')
}
序列化这一步的时候就可能会报错