js的数据类型

136 阅读2分钟
  • number类型

    • 正数

    • 负数

    • 小数

    • NaN: not a number 不是一个有效数字,但是属于number类型 型

      • NaN和NaN本身不相等,和其他值也不相等
      • isNaN([value]):检测当前值是否不是有效数字,如果不是返回true,反之是有效数字则返回false
      • Object.is(NaN,NaN) 这是由于is做了内部处理
      • 项目中常用NaN的场景:
        • 显示转换: Number([value]) | parseInt/parseFloat([value])
        • 隐式转换
          • 数学运算
          • 基于 == 比较的时候
          • isNaN([value])
    • Infinity:无限大 -Infinity:无限小

  • string 类型

    • '' | ""

    • 模板字符串

    • 把其他值转换为字符串

      • 显示:String([value]) 或者 [value].toString()
      • 隐式
        • 加号除了数字运算,还有产生字符串的拼接
    • 上菜

    • 总结

      • 如果"+"存在且在中间,有一边是对象,则也可能成为字符串拼接
        • 10+{}或者10+{name:'juejin'} ——> '10[bject Object]'
        • 10+[10] ——> '10[object Object]'
    • 特殊

      • 10+new Number(10) ——> 20
      • {} +10 或者{name:"juejin"}+10 ——> 10 因为{}没有参与运算,浏览器认为这是一个代码块,计算的只有+10
        • ({}+10) ——> '[bject Object]10'
        • let x = {} + 10 console.log(x) ——>'[object Object]10'
    • new Number(10)也是个对象为什么结果是20呢?而不是字符串拼接

    • 底层机制:对象在数学运算的时候

      1. 检测对象的Symbol.toPrimitive 这个属性,如果有的话,基于这个值进行计算,如果没有,如下
      2. 检测对象的valueOf() 这个值,如果有的话,基于这个值进行计算,如果不是原始值【基本类型值】,如下
      3. 检测对象的toString()把其变成字符串
    let obj = {
      [Symbol.toPrimitive]:function() {
        return 10
      }
    }
    console.log(10+obj)  // 20
    
  • Symbol:唯一值

    • 给对象设置一个Symol属性:唯一属性
    • 宏观管理一些唯一标识的时候,也要用到唯一值
    • Symbol是不需要new的,直接Symbol()
    • console.log(Symbol('AA') === Symbol('AA')) ——> false
  • BigInt:大数

    • Number.MAX_SAFE_INTEGER :9007199254740991 最大安全数字

    • Number.MIN_SAFE_INTEGER :-9007199254740991 最小安全数字

    • 凡是超出这个数字进行运算都会发生误差,不可信

    • BigInt(9007199254740991) + BigInt(10) 或者 9007199254740991n + 7n 可以解决大数计算误差的问题