说一说 JS 类型转化机制
类型转化机制
shell
# 类型转换主要分为两大类:
显式类型转换(强制类型转换):你主动调用方法去转换。
隐式类型转换(自动类型转换):JS 引擎在背后悄悄帮你做的。
# 转化方向
类型转化的方向就三个,分别是:转布尔、转数字、转字符强制类型转化
shell
# 转数字
- Number() 将任意类型转为数字
String --- 数字类型字符串转数字,非数字转 NaN,空字符转 0
Boolean --- true 转 1,false 转 0
Undefined --- NaN
Null --- 0
Symbol --- 报错异常
[] --- 0
{} --- NaN
- parseInt() 转化相对宽松(起初遇到数字或者数字字符串就转化为数字,如果开始没有遇到则转为 NaN)
parseInt('12ab123) 结果为 12
parseInt('ab123) 结果为 NaN
# 转字符串
- Sting() 将任意类型转为字符串
Object --- '[object Object]'
[] --- ''
非空数组 --- 去掉所有 [] 后的内容拼接起来转为字符串,对象还是转为 [object Object] 字符串
其他类型全部转化为字符串
- .toString():大部分值都有这个方法,但 null 和 undefined 没有,调用会报错。
# 转布尔
- Boolean() 将任意类型转为布尔
String --- 除了空字符串为 false,其他都为 true
Number --- 除了 0 +0 -0,NaN,其他都为 true
Undefined --- false
Null --- false
Symbol --- true
Object --- true
[] --- true弱转:大于小于等于不等于、加减乘除取模、if()、while() 方法
自动类型转化
shell
# 发生自动类型转化的场景
比较运算符:大于小于等于不等于
算法运算符:加减乘除取模
条件语句:if()、while() 方法
# 比较运算符两侧自动转 数字
俩普通类型:转 Number 再比较
俩引用类型:比较引用地址
普通和引用类型:先把引用类型化为原始再比较,原始值转化过程:obj.valueOf().toString()
注意:对象的原始值是'[object Object]',而数组的原始值则不同,需要去掉[]再转化为字符串,比如: [] --> [] --> '' --> 0 ,也就是:0 == [],结果为 true
# 算法运算符两侧自动转 数字/字符
+ 号 遇到字符串计算会转字符串,除此之外都转数值
# 条件语句自动转布尔值
条件语句里面的值是一个整体注意事项
shell
1. 0、null、undefined 不能作为除数,否则结果为非数字类型,即:NaN、Infinity
2. 精度丢失问题: 0.1 + 0.2 !== 0.3
js 不能准确存储超过16位的数字,否则后面的会丢失精度
整数不丢失精度的范围 -2^53+1到2^53-1,是 16 位
超过 2^53-1 的数值可以用 bigInt 类型表示
3. JavaScript 的精度丢失问题主要源于其使用 IEEE 754 64位双精度浮点数格式来存储数据,这是这种方式的特性
4. null == undefined 结果为 true,这是一个特列,除此以外 null 和 undefined 只与自身相等
5. NaN 与任何都不想等,包括自身
6. Symbol类型参与算法运算会抛异常:TypeError, 但是可以使用 == === 比较,没啥意义因为其只与自身相等