-
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呢?而不是字符串拼接
-
底层机制:对象在数学运算的时候
- 检测对象的Symbol.toPrimitive 这个属性,如果有的话,基于这个值进行计算,如果没有,如下
- 检测对象的valueOf() 这个值,如果有的话,基于这个值进行计算,如果不是原始值【基本类型值】,如下
- 检测对象的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 可以解决大数计算误差的问题
-