转换规则
在js中,类型转换只有3种,分别是:
- 转换为
boolean - 转换为
string - 转换为
number
| 原始类型 | 目标类型 | 转换规则 |
|---|---|---|
| number | boolean | 除了0,-0,NaN,都为true |
| string | boolean | 除了空串都为true |
| undefined,null | boolean | false |
| 引用类型,symbol | boolean | true |
| number | string | 数字对应的字符串 |
| boolean,function,symbol | string | 对应的代码 |
| array | string | [1,2,[3,4,[5,6]],7]=>'1,2,3,4,5,6,7' |
| object | string | '[object Object]' |
| string | number | 如果字符串对应是合法数字则直接转换,否则转为NaN |
| array | number | 空数组为0;仅有一个数字则转为该数字;否则为NaN |
| null | number | 0 |
| 引用类型(数组除外) | number | NaN |
| Symbol | number | 报错 |
对象转原始类型
先调用valueOf方法,如果结果不是原始值,那么再调用toString方法
不同类型对象的valueOf()方法的返回值
| 对象 | 返回值 |
|---|---|
| array | 数组对象本身 |
| boolean | 布尔值 |
| date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC |
| function | 函数本身 |
| number | 数字本身 |
| object | 默认情况下为对象本身 |
| string | 字符串值 |
| math,error | 无valueOf方法 |
参考MDN
使用==运算符时发生的转换
当==两侧数据类型一样时,直接进行数值比较;不一样的话,就会发生类型转换,规则如下:
- 判断两侧是不是
null和undefined,是的话就返回true - 判断两侧是否是
string和number,是的话就将string转换为number - 如果两侧有一方是
boolean,那么将boolean转换为number再进行比较 - 如果一侧是
object另一侧不是,则将其转为原始类型再进行比较 - 如果两边都是
object,则比较二者地址
例 []==![]
!的优先级高于==,因此先运算右边,[]要转换为boolean,即true,![]就是false,问题变为[]==false- 根据规则3,
false要被转换为0,即[]==0 - 根据规则4,将
[]转换为原始类型,得到空字符串 - 根据规则2,空字符串将转为数字0,问题最终变为
0==0,返回true
例 {}==!{}
!的优先级高于==,因此先运算右边{}要转换为boolean,即true,!{}就是false,问题变为[]==false- 根据规则3,
false要转换为0,即[]==0 - 根据规则4,
{}转换为原始类型,得到字符串[object Object] - 根据规则2,将字符串转为数字
NaN,问题最终变为NaN==0,返回false