JS中的数据类型:

  • 原始值类型
    • number :NaN [不是有效数字], Infinity [无穷大]
    • string : 基于 单引号/双引号/反引号 [es6模版字符串] 包起来的都是字符串
    • boolean : true/false
    • undefined
    • null
    • symbol :唯一值

let n = Symbol(‘AA’)
let m = Symbol(‘AA’)
console.log(n === m) // false [唯一值每每都不相等]

  1. - 1.对象的唯一属性

let key = Symbol();
let obj = {
[key]: 100
}
console.log(obj[key])

let arr = Object.getOwnpropertySymbol(obj) //获取所有唯一值对象
arr.foreach( item => {
console.log(item)
})

  1. - 宏管理标识 vue/React
  2. - 底层原理

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

  • bigint
    • 最大/最小安全数 超过最大安全数字进行运算逻辑就不准确了

console.log(Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER)
问题:服务器中有longInt 长整型这种值,如果把这样的值返回给客户端,则客户端无法进行有效的处理 [一般服务器都是以字符串返回,但是字符串进行计算还是需要转换为数字才可以,还是不准确]
数字后面➕n就是 bigint类型

  • 对象类型
    • 标准对象 object
    • 标准特殊对象 Array/RegExp/Date/Error/Math/ArraryBuffer/DataView/Set/Map…
    • 非标准特殊对象 Numer/String/Boolean/Symbol/BigInt… 基于构造函数 [或者object创造出来的原始值对象类型格式的信息,类型属于对象类型] 注:Symbol/BigInt不能被new
    • 可调用对象 【实现了call方法】function

// 字面量:原始值
let n = 10
// 构造函数:对象值
let m = new Number(10)
let z = Object(10)

if(NaN === NaN){
// 不相等的:所以不能基于“是否等于NaN”来检测是否为有效数字
// isNaN(value) : 不论value啥类型,默认隐式转换为数字类型Number(value) 在校验是否为有效数字,如果是有效数字,返回false,不是有效数字才返回true。
// Object.is(NaN,NaN) true 检测两个值是否相等 [不兼容ie「Edge除外」]
}

数据类型检测

  • typeof 运算符

    • typeof [value]
    • 弊端: 返回value所属类型的字符串 例如: ‘number’ ‘string’
    • 不能检测null typeof null 的结果为 object
    • 除可调用对象 [函数] 会返回 ‘function’ [不论是箭头函数,构造函数,生成器函数,以及普通函数等 都返回 ‘function’] 其余的对象数据值返回都是 object
    • typeof 检测一个未被声明的变量不会报错 ,返回 ‘undefined’
    • 优势: typeof 检测数据类型还是很快的,检测原始值类型【除了null】还是很准确的
  • instanceof 【本意:检测实例是否属于某个类】

  • construtor 【本意:获取构造函数】
  • Object.prototype.toString.call(value) 检测数据类型
  • Array.isArray(value) 检测值是否为数组

数据类型转换规则

  • 把其他类型转换为对象
    • Object(value)
  • 把其他类型转换为Number

    • number(value)一般用于隐式转换
    • 字符串转换为数字 : 空字符串为0 出现一个非有效字符结果就为NaN
    • null : 0
    • undefined : NaN
    • Symbol :报错
    • BigInt 正常转换
    • 对象遵循 Symbol.toPrimitive/valueOf/toString/Number
    • parentInt/parentFloat(value)
      • 首先会把value变为字符串,从左侧第一个字符串开始找,直到找到一个非有效数字为止,把找到的结果转换为数字,一个没找到结果就是NaN 「parentFloat会多识别一个小数点」
  • 把其他类型转换为字符串

    • 规则:原始值转换为对象直接用引号包起来,【bigint会去除n】(除对象转换为字符串是特殊的)
    • toString [排除Object.prototype.toString「是用来检测数据类型的」]
    • 字符串/模版字符串拼接 console.log(1 + ‘1’) ‘+’两边,有一边出现了字符串或者部分对象 则都是按照字符串拼接处理的
      • console.log(+n) //10 转换为字符串
      • console.log(++n) //11 转换为字符串后累加1
      • console.log(n++) //11 转换为字符串后累加1
      • {} + 10 //10 把左侧{}当作代码块 不参与运算,运算的只有 +n
      • 10 + {} //10[Object Object] 字符串拼接
    • 不是所有对象都是字符串拼接
      • 规则:
      • 先去调取对象的Symbol.toPrimitive 属性值,如果没有这个熟悉
      • 再去调取对象的 valueOf 获取原始值,如果不是原始值
      • 再去调用对象的 toString 转换为字符串 [如果是想转换为数字,则还会调用Number处理]
  • 把其他类型转换为布尔

    • 规则:只有 “0,NaN,null,undefined,空字符串”会变为false,其余都是true
      • Boolean(value) 类型转换
      • !!(value) 转换为布尔类型
      • !(value) 转换为布尔类型在取反
      • 条件判断 例如: if(1){}
      • a || b a&&b