总结一些常(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