• 如何判断JavaScript的数据类型?


    JavaScript数据类型

    本文将讲解我目前所知道的判断JavaScript数据类型的方法。

    JavaScript数据类型一共有7种:

    • Undefined
    • Null
    • Boolean
    • String
    • Symbol
    • Number
    • Object

    除了Object之外的6种属于原始数据类型。有时,我们还会细分Object的类型,比如ArrayFunctionDateRegExp等。

    判断JavaScript数据类型:

    typeof

    1 typeof undefined // "undefined"
    2 typeof null // "object"
    3 typeof 1 // "number"
    4 typeof "1" // "string"
    5 typeof Symbol() // "symbol"
    6 typeof function() {} // "function"
    7 typeof {} // "object"

    问题一:typeof不能识别null,如何识别null
    答案:如果想要判断是否为null,可以直接使用===全等运算符来判断(或者使用下面的Object.prototype.toString方法):

    1 let a = null
    2 a === null // true

    问题二:typeof作用于未定义的变量,会报错吗?
    答案:不会报错,返回"undefined"。

    1 typeof randomVariable // "undefined"

    问题三:typeof Number(1)的返回值是什么?
    答案:"number"。注意NumberString作为普通函数调用的时候,是把参数转化为相应的原始数据类型,也就是类似于做一个强制类型转换的操作,而不是默认当做构造函数调用。注意和Array区分,Array(...)等价于new Array(...)

    1 typeof Number(1) // "number"
    2 typeof String("1") // "string"
    3 
    4 Array(1, 2, 3)
    5 // 等价于
    6 new Array(1, 2, 3)

    问题四:typeof new Number(1)的返回值是什么?
    答案:"object"

    1 typeof new Number(1) // "object"
    2 typeof new String(1) // "object"

    instanceof

    instanceof不能用于判断原始数据类型的数据:

    3 instanceof Number // false
    '3' instanceof String // false
    true instanceof Boolean // false

     instanceof可以用来判断对象的类型:

    1 var date = new Date()
    2 date instanceof Date // true
    3 
    4 var number = new Number()
    5 number instanceof Number // true
    6 
    7 var string = new String()
    8 string instanceof String // true

    需要注意的是,instanceof的结果并不一定是可靠的,因为在ECMAScript7规范中可以通过自定义Symbol.hasInstance方法来覆盖默认行为。详情参见ECMAScript7规范中的instanceof操作符。

    Object.prototype.toString

    1 Object.prototype.toString.call(undefined).slice(8, -1) // "Undefined"
    2 Object.prototype.toString.call(null).slice(8, -1) // "Null"
    3 
    4 Object.prototype.toString.call(3).slice(8, -1) // "Number"
    5 Object.prototype.toString.call(new Number(3)).slice(8, -1) // "Number"
    6 
    7 Object.prototype.toString.call(true).slice(8, -1) // "Boolean"
    8 Object.prototype.toString.call('3').slice(8, -1) // "String"
    9 Object.prototype.toString.call(Symbol()).slice(8, -1) // "Symbol"

    由上面的示例可知,该方法没有办法区分数字类型和数字对象类型,同理还有字符串类型和字符串对象类型、布尔类型和布尔对象类型。

    另外,ECMAScript7规范定义了符号Symbol.toStringTag,你可以通过这个符号自定义Object.prototype.toString方法的行为:

     1 'use strict'
     2 var number = new Number(3)
     3 number[Symbol.toStringTag] = 'Custom'
     4 Object.prototype.toString.call(number).slice(8, -1) // "Custom"
     5 
     6 function a () {}
     7 a[Symbol.toStringTag] = 'Custom'
     8 Object.prototype.toString.call(a).slice(8, -1) // "Custom"
     9 
    10 var array = []
    11 array[Symbol.toStringTag] = 'Custom'
    12 Object.prototype.toString.call(array).slice(8, -1) // "Custom"

    因为Object.prototype.toString方法可以通过Symbol.toStringTag属性来覆盖默认行为,所以使用这个方法来判断数据类型也不一定是可靠的。

    Array.isArray

    Array.isArray(value)可以用来判断value是否是数组:

    Array.isArray([]) // true
    Array.isArray({}) // false
    (function () {console.log(Array.isArray(arguments))}()) // false

    总结

    本文讲解了我目前所知道的判断JavaScript数据类型的方法,希望大家能有所收获。

  • 相关阅读:
    Eclipse配置Maven私服
    ubuntu下使用Nexus搭建Maven私服
    Ubuntu系统的Redis安装配置
    centos7.6安装dpdk-stable-19.11.10
    微软的分布式应用框架 Dapr Helloworld
    Caddy源码阅读(二)启动流程与 Event 事件通知
    Caddy源码阅读(一)Run详解
    Caddy 源码全解析
    假装前端工程师(一)Icework + GitHub pages 快速构建可自定义迭代开发的 react 网站
    caddy & grpc(3) 为 caddy 添加一个 反向代理插件
  • 原文地址:https://www.cnblogs.com/Best-Chen/p/9739487.html
Copyright © 2020-2023  润新知