首先,类型转换是我们经常遇到的知识点,一般在 JS 类型转换当中只有三种情况:
- 转换成布尔值
- 转换成数字
- 转换成字符串
所有的转换规则都在以下表格:
| 原始值 | 转换目标 | 结果 |
|---|---|---|
| number | 布尔值 | 除了0、-0、NaN都为true |
| string | 布尔值 | 除了空字符串(‘’)都为true |
| undefined、null | 布尔值 | false |
| 引用类型 | 布尔值 | true |
| number | 字符串 | 8 => ‘8’ |
| Boolean、函数、Symbol | 字符串 | true => ‘true’ |
| 数组 | 字符串 | [1, 2] => ‘1, 2’ |
| 对象 | 字符串 | {} => ‘[object Object]’ |
| string | 数字 | ‘8’ => 8,’a’ => NaN |
| 数组 | 数字 | 空数组为0,存在一个元素且为数字转成数字,其它情况NaN |
| null | 数字 | 0 |
| 除了数组的引用类型 | 数字 | NaN |
| Symbol | 数字 | 抛错 |
转Boolean
在条件判断时,除了0, -0, NaN,undefined,null,false,'',
其它所以值都为true,包括对象。
对象转原始类型
对象在转类型的时候,会调用内置的 Symbol.toPrimitive 函数,大概的逻辑是这样的:
如果已经是原始类型了,那就不需要转换了
调用 x.valueOf(),如果转换为基础类型,就返回转换的值
调用 x.toString(),如果转换为基础类型,就返回转换的值
如果都没有返回原始类型,就会报错
当然,你也可以重写 Symbol.toPrimitive,该方法在转原型类型时优先级最高
1 | let obj = { |
四则运算符
首先,先来说下加法运算符,会有两个特点:
其中一方是字符串,那么就会把另一方也转为字符串
如果一方不是字符串或者数字,那么会将它转成字符串或者数字
然后就是非加法运算符,只要其中一方是数字,那么另一方就会被转为数字
比较运算符
- 如果是对象,就通过
Symbol.toPrimitive转换对象 - 如果是字符串,就通过
unicode字符索引来比较
== vs ===
对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换,而 === 不会
假如我们需要对比 x 和 y 的值是否相等,就会进行如下流程:
- 首先判断两者类型是否相等,是的话比较大小
- 类型不相同的就会进行类型转换
- 会先判断是否在对比
undefined和null,是的话就会返回true - 判断两者类型是否为
string和number,是的话就会将字符串转换成number - 判断其中一方是否为
boolean,是的话就把boolean转成number再进行判断 - 判断其中一方是否为
object且另一方为string、number或者symbol,是的话就会把object转为原始类型再进行判断
本文完, 感谢阅读。