1.Array.isArray()
const arr = []
console.log(Array.isArray(arr)) //true
2.instanceof
const arr = []
console.log(arr instanceof Array) //true
instanceof 可以用来检测复杂数据类型,当无法检测简单数据类型,例如:
const str = '字符串‘ 通过instanceof进行检测,打印str instanceof String的结果却是false
3.通过constructor判断
const arr = []
console.log(arr.constructor === Array) //true
为什么可以根据constructor进行判断呢?
这是因为其实通过[ ]创建一个数组,本质上其实是通过 new Array(),通过new了Array这个构造函数来创建一个数组实例。
那么是数组实例身上有constructor么?
不是的,constructor是这是数组实例的原型对象身上的一个属性,原型对象身上的constructor属性指向了Array这个构造函数,那么通过__proto__顺着原型查找到原型对象身上,我们就可以通过判断实例arr.constructor是否指向构造函数Array,进而判断该实例是否是Array构造函数的实例对象,如果是则说明是数组类型。
4.Object.prototype.toString.call()
const arr = []
console.log(Object.prototype.toString.call(arr)) //[object Array]
console.log(typeof(Object.prototype.toString.call(arr))) //string
console.log(Object.prototype.toString.call(arr).includes('Array')) //true
Object.prototype.toString.call()方法既可以判断简单数据类型,也可以判断复杂数据类型,调用该方法得到的结果其实是一个字符串。