类型转换只有三种情况,分别是
转换规则
原始值转换规则 (null, undefined, number, string, boolean, symbool)
转为布尔值
- 转换为false: undefined, null, false, NaN, '', 0, -0
- 其他全部为true
转为数字
- null -> 0
- undefined -> NaN
- symbol -> 报错
- boolean
- string
- '1' -> 1
- '01' -> 1
- '0x10' -> 16
- '1e1' -> 10
- 'a' -> NaN
- '\n' -> 0
转为字符串
- null -> 'null'
- undefined -> 'undefined'
- symbol -> 'Symbol(<>)'
- boolean
- true -> 'true'
- false -> 'false'
- number
- 1 -> '1'
- 010 -> '8'
- 0x10 -> '16'
- 1e2 -> '100'
对象转换规则
普通对象
- 先调用Symbol.toPrimitive,如果存在的话
- 如果需要转字符串类型就调用x.toString(),如果是基础类型就返回
- 如果不是字符串类型的话就先调用
valueOf
, 结果不是基础类型的话再调用 toString
- 调用 x.valueOf(),如果转换为基础类型,就返回转换的值
- 如果都没有返回原始类型,就会报错
数组
- 转布尔值:true
- 转数字
- [] -> 0
- [a] (存在一个可转数字的元素a)
- 1 -> 1
- '1' -> 1
- null -> 0
- undefined -> 0
- true/false -> NaN
- [a, b, c] -> NaN
- 转字符串(处理方式类似arr.join(',')),
- 其中null和undefined转换为空字符串''
- 有Symbol会报错
什么时候会触发转换
四则运算
- 运算中其中一方为字符串,那么就会把另一方也转换为字符串
- 如果一方不是字符串或者数字,会将它转换为数字或者字符串
比较运算符 (大于小于)
- 如果是对象,就通过toPrimitive转换对象
- 如果是字符串,就通过Unicode字符索引(
string.prototype.charCodeAt(index)
)来比较
==
- 类型相同,比大小
- 类型不同先转换,再比较
- null == undefined // true
- 两者类型是否为
string
和 number
,string
转为 number
- 其中一方是否为
boolean
,是的话会把 boolean
转为 number
- 其中一方是否为
object
,且另一方为 string
、number
或者 symbol
,是的话会把 object
转换为原始类型
练习一下==
[] == ![]
分析:
- 运算优先级,先!再==
!
的时候将 []
转为boolean为 true
,加上 !
最终结果为 false
- 比较
[] == false
,将 false
转换为0
- 比较
[] == 0
,将 []
转换为0
- 比较
0 == 0
,结果为 true
Share
WeiBo
Twitter
QZone
WeChat
←
↑
↓