js的基本数据类型

185 阅读4分钟

MDN定义

根据最新的 ECMAScript 标准,js数据类型定义了8种,包括7种基本数据类型也有人称为原始数据类型、值类型和对象(Object)

让我来简单记录一下js基本数据类型:

  1. undeifined
    • 变量被定义初始值是undefined
         var m;
         console.log(m) //undefined
      
    • 函数没有指定返回值默认返回undefined
      function fn(){}
      console.log(fn) //undefined
      
    • 转换成数字 Number(undefined) //NaN
    • 全局对象一属性
  2. null
    • 变量定义的时候可以赋值为null
      var m = null

    • 清除堆内存

      function fn(){...}
      fn = null;
      
      
      var obj = {}
      obj = null
      
    • 转换成数字 Number(null) //0

    • 不是全局对象的属性

    • 注意

      typeof null //‘object’
      
  3. Boolean 布尔
    • 大多在逻辑判断中使用
    • fasle的表现形式
      空字符串:“”、‘’、``
      数字:0 undefined
      null
      false
      ...
  4. Symbol 唯一值
    • 常见使用方法
      • 给对象设置一个symbol()属性:唯一属性,减少属性冲突上的处理
        let x = Symbol();
        let symbolObj = {
            [x]: 'symbol'
        }
        console.log(symbolObj[x]) //'symbol'
        
      • 宏观管理一些唯一的标识的时候,也是使用唯一值
        let sym = Symbol('only')
    • 注意
      • 不能使用new
        new Symbol()//Uncaught TypeError: Symbol is not a constructor
      • 它每次都会创建一个新的 symbol类型
        Symbol('only') == Symbol('only') //false
  5. BigInt 大数
    • Number.MAX_SAFE_INTEGER 9007199254740991 最大安全数字
    • Number.MIN_SAFE_INTEGER -9007199254740991 最小安全数字
    • 当超过这个数字的时候,js计算会出现偏差,这时变需要使用BigInt
      console.log(9007199254740991+10)  //9007199254741000
      console.log(BigInt(9007199254740991)+BigInt(10)) //9007199254741001n
      
    • 用法 1、BigInt(val)
      2、在数字后边直接加上n:[val]n
    • 使用场景:
      大型项目中,服务器返回给客户端的数据可能出现大数【服务端可以给予longint存储,这个值可能出现大于最大安全数的情况】
  6. Number 数字
    • NaN:not a number,不是一个有效数字
      console.log(typeof NaN) //number
      • NaN和本身不相等
        console.log(NaN == NaN) //false
      • 检测一个变量是否为NaN
        • isNaN(value):检测当前值是否为非有效数字(NaN),是NaN返回true,反之返回false console.log(isNaN(NaN))//true
          console.log(isNaN(1))//false
        • Object.is(value1,value2):方法判断两个值是否为同一个值。 console.log(Object.is(NaN,NaN)) //true
      • 出现NaN的情况:不部分为把其他数据类型转换成Number数据类型
        • 显示转换:Number(value) / parseInt(value)、parseFloat(value)
        • 隐式转换
          • 数学运算
          • 基于“==”号进行比较的时候
          • isNaN(value)
    • Infinity:无穷大;-Infinity:无穷小
      超出 1.7976931348623157E+103088 的数值即为Infinity,小于 -1.7976931348623157E+103088 的数值为无穷小
      console.log(Infinity) //number
      console.log(typeof Infinity) //number
  7. String 字符串
    • 表现形式
      • ""双引号
      • ''单引号
      • ``模版字符串
    • 把其他值转换成字符串
      • 显示转换:String(value) / value.toString()
      • 隐式转换
        • 加号+除了会产生数学运算还会产生字符串拼接 let n = '10', m = 10;
        1. 表现形式
          • "+"在存在两边的情况下,如果一边存在字符串,那么会变成字符串拼接 console.log(m + n) //'1010'
            console.log(n + m) //'1010'

          • "+"只存在一边,会转换成数字
            console.log(+n) //10

          • "++"只有一边,先转换成数字再自身累加1
            console.log(++n) //'11'

            • 延伸“i=i+1和i++/++i的区别”
              • 当i为数字的时候没有区别
              • 当i为字符串的时候i=i+1会进行字符串拼接,i++/++i会先进行一步数字转换,即先把i转换成数字Number
          • “+”在存在两边的情况下,如果一边是对象,那么可能变成字符串拼接 10+{} //'10[object Object]'
            10+[10] //'1010'

            • 特殊情况:
              • 1、10+New Number(10)//20
              • {}+10 / {name:1}+10 //10
                说明:
                1、此情况下需在控制台中直接打印,不能在js文件中输出
                2、代码不能用“()”包裹
                3、浏览器认为{}是代码块,计算+'10',但是如果加上()包裹,或者赋值let a= {}+10,从语法分析上要参加到运算中
            • 对象在做数学运算时的底层机制:
              1、检测对象的Symbol.toPrimitive,如果有,则基于这个值进行计算,如果没有进行第二步
              const obj = {
                [Symbol.toPrimitive]: function (hint) {
                  //hint 记录浏览器识别出来的 default/string/...
                  console.log(hint)
                  return 10
                }
              }  
              console.log(10 + obj) //20
              
              const obj1 = {
                [Symbol.toPrimitive]: function (hint) {
                  //hint 记录浏览器识别出来的 default/string/...
                  console.log(hint)
                  return '10'
                }
              }  
              console.log(10 + obj) //'1010'
              
              2、检测对象有没valueOf()这个值(原始值),如果有责基于这个值进行计算,如果不是原始值,进行第三步
              console.log(10 + new Number(10)) //20
              (new Number(10)).valueOf() //10
              3、检测对象的toString(),把其变为字符串,如果是‘+’处理,则变成字符串拼接,
              console.log(m + {
                  value: 10
                })//`10[object Object]`
                
              ({value:10}).toString() //'[object Object]'
              
              4、如果最后想变成数字,则再把字符串转换成数字即可

这就是一些js数据基本类型的简单整理。