一、前言
首先定义了一个数组arr、一个对象obj:
const arr = [1, 2, 3]
const obj = {
a: '1'
}
二、判断对象是否为数组的5种方法
1、isArray()
Array.isArray(value),如果value为数组,则返回true;如果为非数组,则返回false:
console.log(Array.isArray(arr)) // true
console.log(Array.isArray(obj)) // false
2、instanceof
使用instanceof操作符,如果一个实例的原型链中出现相应的构造函数,则instanceof返回true;否则返回false:
console.log(arr instanceof Array) // true
console.log(obj instanceof Array) // false
3、isPrototypeOf()
每个原型都可以调用这个方法,如果传入的参数的原型链上包含调用这个方法的原型,则返回true;否则返回false:
console.log(Array.prototype.isPrototypeOf(arr)) // true
console.log(Array.prototype.isPrototypeOf(obj)) // false
4、constructor
每个实例都能通过一个内部指针[[Prototype]]来访问其构造函数的原型上的方法,而构造函数的原型有一个叫做constructor的指针,其指向构造函数,所以可以通过constructor来判断:
console.log(arr.constructor === Array) // true
console.log(obj.constructor === Array) // false
5、Object.prototype.toString.call()
每个对象都有一个toString()方法,如果此方法在自定义对象中未被覆盖,则toString()返回[object type],其中type是对象的类型,因此可以用它通过调用call()或者apply()来判断对象类型:
console.log(Object.prototype.toString.call(arr)) // '[object Array]'
console.log(Object.prototype.toString.call(obj)) // '[object Object]'
三、总结
上面5种方法中,其中instanceof、isPrototypeOf、constructor三种都是利用原型链来判断的方法。除了isArray外,其它四种方法都可以用来判断其它对象类型,建议实际使用时选择isArray方法,毕竟是数组自带方法。