基本数据类型1

91 阅读2分钟

基本数据类型

1. number 数字

具体分类

1.正数 负数 零 小数 ...

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

    > NaNNaN本身不相等,和其它值也都不等

    > Object.is(NaN, NaN):true  「is方法内部做了特殊的处理」

    > isNaN([value]):检测当前值是否不是效数字,不是有效数字返回true,反之是有效数字则返回false

3.Infinity:无限大  -Infinity:无限小

把其它数据类型转换为number 类型

  • 显式转换「 Number([value]) | parseInt/parseFloat([value]) 两者的底层处理规则是不一样的」

  • 隐式转换 -> Number

    • 数学运算
    • 基于==比较的时候
    • isNaN([value])
    • ...

例如

console.log(typeof NaN); //->'number'
console.log(typeof Infinity); //->'number'
console.log(NaN === NaN); //->false
console.log(Object.is(NaN, NaN)); //->true

2. string 字符串

string字符串

+ 普通字符串
+ 模板字符串``

把其它值转换为字符串

  1. 显式:String([value]) 或者 [value].toString() 「->延展出数据类型检测」

  2. 隐式: + 加号除了数学运算,还会产生字符串拼接

    1. 如果“+”两边,有一边是对象,则也可能会成为字符串拼接

      • 10+{} 或者 10+{name:'zhufeng'} -> '10[object Object]'
      • 10+[10] -> "1010"
    2. 特殊:

      • 10+new Number(10) -> 20
      • {}+10 或者 {name:'xxx'}+10 -> 10 「原因:{...}没有参与运算,浏览器认为其是一个代码块,计算‘+10’」
        • ({}+10) -> '[object Object]10'
        • let x={}+10 -> '[object Object]10' 下面两种不论是包起来还是赋值,从语法分析上都要参与到计算中了
      • ...

拓展:对象在做数学运算的时候

  • 检测对象的 Symbol.toPrimitive 这个属性值,如果有则基于这个值进行运算,如果没有

  • 检测对象的 valueOf() 这个值「原始值:基本类型值」,如果有则基于这个值进行运算,如果不是原始值

  • 获取对象的 toString() 把其变为字符串 -> 如果是‘+’处理,则看到字符串了,所以变为字符串拼接

  • 如果最后就是想变为数字,则再把字符串转换为数字即可

例如

let n = "10",
  m = 10;
console.log(10 + n); // “+”有一边出现了字符串「前提:有两边」会变为字符串拼接 ‘1010’
console.log(+n); // “+”只有一边,把值转换为数字  10
console.log(++n); // “++”和上面一样也是转换为数字,但是还会自身累加一   11
let obj = {};
console.log(10 + obj); //->'10[object Object]'

3. Symbol():创建唯一值

作用

+ 给对象设置一个Symbol属性:唯一属性 「减少属性处理上的冲突」
+ 宏观管理一些唯一的标识的时候,也是用唯一值
+ ...

例如

new Symbol(); //Uncaught TypeError: Symbol is not a constructor
console.log(Symbol("AA") === Symbol("AA")); //->false
let obj = {
  [Symbol()]: 100,
};
console.log(obj[Symbol()]); //->undefined

let x = Symbol();
let obj = {
  [x]: 100,
};
console.log(obj[x]); //->100

拓展:很多 JS 的内置原理都是基于这些 Symbol 的属性来处理的

  • Symbol.toPrimitive
  • Symbol.hasInstance
  • Symbol.toStringTag
  • Symbol.iterator
  • ...

4. BigInt:大数