JS中的数据类型

114 阅读2分钟

基本数据类型(值类型)

  • number

    包括两种特殊的:

    非有效数字 NaN,而且 NaN===NaN结果为false

    无穷大Infinity,Infinity===Infinity结果为true

  • string

  • boolean

  • null

  • undefined

  • symbol(唯一值)

    如何使用,以及注意事项

    console.log(Symbol())  // 唯一值
    console.log(Symbol()===Symbol())  //false
    
    let symb = Symbol()
    console.log(symb===symb)  // true
    
    console.log(new Symbol()) // 不可以这样写  Uncaught TypeError: Symbol is not a constructor
    

    项目中的应用

    • 给对象设置唯一的属性

    • 在vuex/redux中做行为派发的时候,统一管理派发的行为标识,标识的值可以是唯一值

    • 很多其他的原理 都是基于Symbol的方法的

      例如Symbol.toPrimitive方法(原始值):把一个对象数据类型的值,转换为数字/字符串

      • 首先查找对象的Symbol.toPrimitive属性 (如果有按照这个属性处理)
      • 如果不存在这个属性,紧接着调用对象的valueOf方法获取原始值(原始值指的是基本类型值)
      • 如果获取不到原始值(不是基本数据类型的值),则再调用toString&Number转换成字符串或者数字
  • binint(超大数字)

    大数字运算的时候 会出错,可以直接加个n

    Number.MAX_SAFE_INTEGER 可以获得最大安全数,超过这个数的计算就不准确,运算的时候可以直接加n转换为binint类型。

     900719925474099199n
    
     900719925474099199n+1n
    

引用数据类型

  • 对象类型 object

    普通对象、数组对象、正则、日期、JSON、Set、Map

  • 函数类型 function(其实函数类型也是对象,只是有区别,暂时这么细分)

    普通函数、构造函数、箭头函数、生成器函数

检测数据类型

  • typeof

    typeof不能细分对象,不能区分null和object。原理:所有数据类型值在计算机存储都是按照“二进制”存储的,typeof检测的时候,是按照计算机存储二进制的值来检测的。

    只要是对象都是以 000 开始的,而null -> 000000,所以typeof null => 'object'。

    函数 function不是以000开始的,所以typeof function(){} => 'function'。

    typeof NaN => 'number'
    typeof null=> 'object'
    typeof {} => 'object'
    
  • instanceof

  • Object.prototype.toString.call

  • constructor

检测类型具体详情可以参考JS中四种数据类型检测底层机制

知识点

  1. 检测是否为有效数字 用isNaN(变量)

  2. Object.is(value1,value1) 方法判断两个值是否为同一个值,返回布尔类型值。

    与== 运算不同。 == 运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 "" == false 判断为 true), 而 Object.is不会强制转换两边的值。

    与=== 运算也不相同。 === 运算符 (也包括 == 运算符) 将数字 -0 和 +0 视为相等 ,而将Number.NaN 与NaN视为不相等

     Object.is(NaN,NaN)  true