有时候我们要区分Array和Object,但是无论是对象还是数组,我们用typeof来操作,它返回的都是object,这样的话我们就没法区分了,这样问题就出现了,我们要怎样才能清晰的区分这两种引用类型呢?

# 1、constructor

    var arr = [1, 2, 3]
    var obj = {
        name: 'clearives',
        age: 26
    }
    console.log(arr.constructor)    //function Array() { [native code] }
    console.log(obj.constructor)    //function Object() { [native code] }

1
2
3
4
5
6
7
8

# 2、toString方法

    var arr = [1, 2, 3]
    var obj = {
        name: 'clearives',
        age: 26
    }
    console.log(Object.prototype.toString.call(arr))    //[object Array]
    console.log(Object.prototype.toString.call(obj))    //[object Object]

1
2
3
4
5
6
7
8

这里我们通过对象原型的toString方法,巧妙的判断出了哪个是对象,哪个是数组,而且这个方法几乎无缺陷。

# 3、instanceof

    var arr = [1, 2, 3]
    var obj = {
        name: 'clearives',
        age: 26
    }
    console.log(arr instanceof Array)    //true
    console.log(obj instanceof Array)    //false

1
2
3
4
5
6
7
8

# 4、length

正常情况下,我们可以通过length方法来判断,因为数组的length是number类型,而对象的length是undefined,所以可以判断,但是我们假设一下,一个对象里面有一个key值为length,而恰好它的值又是number类型,这就出问题了,所以我们一般不通过这种方法来区分数组还是对象。

这里说了四种方法,应该还有其它的方法,但是我就觉得第二种就很好了,也很实用,有兴趣可以去研究一下别的方法。

更新于: 7/8/2020, 7:46:15 AM