js判断一个变量是否为数组或对象的方法整理,各种判断方法对比
1. Array.isArray() (推荐)
通过es6的Array.isArray()实现
let arr = [] console.log(Array.isArray(arr)) //true
2.Object.prototype.toString.call (推荐)
let arr = [] console.log(Object.prototype.toString.call(arr)) //[object Array] console.log(Object.prototype.toString.call(arr)===Object.prototype.toString.call([])) //true
3.instanceof (不推荐)
instanceof用来判断一个变量是否是一个对象的实例,我们可以通过instanceof来判断是否为数组
let arr = [] console.log(arr instanceof Array ) //true
虽然能判断,但是个人感觉还是不准确,比如某个对象继承数组Array,则该对象的实例通过instanceof Array判断的时候,也返回true,可是这个实例并不是纯粹的数组,我们通过上面的方法可以判断,这个是个对象
//创建一个对象Arr继承Array function Arr() { this.name = 'test' } Arr.prototype = new Array() Arr.prototype.constructor = Arr Arr.prototype.say = function () { console.log('我是方法 say') } let arr = new Arr() console.log(arr instanceof Array) //true arr.say() //我是方法 say arr.push(1) //可以 arr.push(2) //可以 console.log(arr) //Arr { '0': 1, '1': 2, name: 'test', length: 2 } console.log(Object.prototype.toString.call(arr)) //[object Object]
4.constructor
上面instanceof会将继承Array的对象判断为数组,我们也可以通过直接判断变量的构造函数是否等于Array来判断
let arr = [1,2,3] console.log(arr.constructor===Array) //true
1.Object.prototype.toString.call (推荐)
let obj = {} console.log(Object.prototype.toString.call(obj)) //[object Object]
2.constructor (推荐)
let obj = {} console.log(obj.constructor === Object) //true
3.instanceof (一点也不推荐)
由于js里面各种类型变量都是基于对象的,所以这个是无法正确判断的
console.log({} instanceof Object) //true console.log([] instanceof Object) //true console.log(new String() instanceof Object) //true
4.typeof (一点也不推荐)
利用typeof也无法正确判断,因为null、数组和对象都会返回对象
console.log(typeof null) //object console.log(typeof []) //object console.log(typeof {}) //object
点赞(2)