js判断一个变量是否为数组或对象的方法整理,各种判断方法对比

蛰伏已久 2019-10-23

是否为数组的判断方法

 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

-END-

点赞(2)