总结一些常(e)见(xin)的类型转换相关的面试题。
运算
1 | var o = { |
javascript引擎在进行运算的时候,会尝试把操作对象转换成数值。
尝试把 o
转换成数值,先调用 o.valueOf
,返回非原始值,继续尝试调用 o.toString
,返回的依然不是原始值,抛出异常。
假设我们把 o.toString
改下:
1 | var o = { |
toString返回的"0"
/"1"
都是原始值,引擎会继续尝试把他们转换成数值。
全等===
全等不进行类型转换,如果是引用类型的话比较引用地址是否一致。
相等==
贴一张网上找的图:
根据这个流程看题:
[] == ![]
结果:true
解析:
!
的优先级比较高,转换成 [] == false- 转换成 [] == 0
- 转换成 toPrimitive([]) == 0
- []获取原始值先调用valueOf返回
[]
,非原始值,继续调用toString返回""
,得 “” == 0 ""
转成数值0,最终 0 == 0
{} == !{}
结果:false
解析:
!
的优先级比较高,转换成 {} == false- 转换成 {} == 0
- 转换成 toPrimitive({}) == 0
- {}获取原始值先调用valueOf返回
{}
,非原始值,继续调用toString返回[object Object]
,得 “[object Object]” == 0 "[object Object]"
无法转换成数值,得NaN
,最终 NaN == 0