js类型转换
转换规则
在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