js-数据类型判断

161 阅读3分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

数据类型判断

介绍

我们清楚,js 的 类型有哪些

  • 基本数据类型(7):stringnumberbooleannullundefinedsymbolbigint

  • 引用数据类型:objectarraydatefunctionregexp ...

关于对 js 的 基本数据类型 或者 引用数据类型 的判断,统称为 数据类型判断

有四种 数据类型判断 的方式,为别为:

  • typeof

  • instanceof

  • constructor

  • toString

定义数据

  • 基本数据类型
    const myNumber = 111
    const myString = '111'
    const myBoolean = true
    const mySymbol = Symbol('111')
    const myBigint = 111n
    const myUndefined = undefined
    const myNull = null
  • 引用数据类型
    const myObject = {a:111}
    const myArray = [111]
    const myDate = new Date()
    const myRegExp = new RegExp()
    const myFunction = () => {
      console.log('111')
    }

typeof

typeof 可以 较好 的对 基本数据类型 进行判断,但是 无法对 引用数据类型 进行判断。

下面可以看下代码示例

  • 基本数据类型

        console.log(typeof myString)
    
        console.log(typeof myNumber)
    
        console.log(typeof myBoolean)
    
        console.log(typeof mySymbol)
    
        console.log(typeof myBigint)
    
        console.log(typeof myUndefined)
    
        console.log(typeof myNull)
    

    结果为

        string
        number
        boolean
        symbol
        bigint
        undefined
        object
    
  • 引用数据类型

        console.log(typeof myObject)
    
        console.log(typeof myArray)
        
        console.log(typeof myDate)
        
        console.log(typeof myRegExp);
    
        console.log(typeof myFunction)
    

    结果为

        object
        object
        object
        object
        function
    
  • 总结

可以看到 typeof

  • 基本数据类型 除了 nullobject 以外,其余识别的都是 基本数据类型本身的值

  • 引用数据类型 除了 function 为 function 以外,其余识别的都是 object

至于 null 为什么被识别成 object

就是底层机器码的问题,null 机器码都为0,而 0 又是 object

所以将 null 当作 object

instanceof

先说一下用法,示例: xxx instanceof yyy

判断 xxx 对象 是否是 yyy,返回值是 true 或者 false

可以看到 我说的是 xxx 对象,意思很明显

就是 instanceof 左侧 必须是 对象

  • 它只能判断 对象,只能判断 引用数据类型

  • 非对象 不可以判断,或者说判断后,肯定是 false

    console.log(myObject instanceof Object)

    console.log(myArray instanceof Array)

    console.log(myDate instanceof Date)

    console.log(myRegExp instanceof RegExp)

    console.log(myFunction instanceof Function)

结果为

    true
    true
    true
    true
    true

注意点

这里还有一个注意点,注意事项,那就是以上的 引用数据类型,在 instanceof 中最终都可以识别成 Object

    console.log(myObject instanceof Object)

    console.log(myArray instanceof Object)

    console.log(myDate instanceof Object)

    console.log(myRegExp instanceof Object)

    console.log(myFunction instanceof Object)

结果为

    true
    true
    true
    true
    true

为什么会出现这个情况,因为 instanceof 检测的是原型,关于原型原型链后续会讲解。

constructor

这里讲解用法

通过值的 .constructor 方法来进行判断,但是不能判断 nullundefined

    console.log(myString.constructor === String)

    console.log(myNumber.constructor === Number)

    console.log(myBoolean.constructor === Boolean)

    console.log(mySymbol.constructor === Symbol)

    console.log(myBigint.constructor === BigInt)

    console.log(myObject.constructor === Object)

    console.log(myArray.constructor === Array)

    console.log(myDate.constructor === Date)

    console.log(myRegExp.constructor === RegExp)

    console.log(myFunction.constructor === Function)

结果为

    true
    true
    true
    true
    true
    true
    true
    true
    true
    true

toString

这是 数据类型判断 最好的一种方式。

通过 Object.prototype.toString.call() 来进行判断,它可以准去的判断数据类型的值。

    console.log(Object.prototype.toString.call(myString))

    console.log(Object.prototype.toString.call(myNumber))

    console.log(Object.prototype.toString.call(myBoolean))

    console.log(Object.prototype.toString.call(mySymbol))

    console.log(Object.prototype.toString.call(myBigint))

    console.log(Object.prototype.toString.call(myUndefined))

    console.log(Object.prototype.toString.call(myNull))

    console.log(Object.prototype.toString.call(myObject))

    console.log(Object.prototype.toString.call(myArray))

    console.log(Object.prototype.toString.call(myDate))

    console.log(Object.prototype.toString.call(myRegExp))

    console.log(Object.prototype.toString.call(myFunction))

结果为

    [object String]
    [object Number]
    [object Boolean]
    [object Symbol]
    [object BigInt]
    [object Undefined]
    [object Null]
    [object Object]
    [object Array]
    [object Date]
    [object RegExp]
    [object Function]

可以对所有的数据类型进行准确的判断。

总结

数据类型判断 的四种方式,在使用 typeofinstanceof 时,一定要多加小心。

建议使用 toString 的方法来精准的判断 当前值的 数据类型。