0 == !0 结果是什么?为什么?
面试速答(30 秒版 TL;DR)
- 结果:
false。 - 原因:
!0先走 ToBoolean 得到true,然后0 == true里true会被转成数字1,最后变成0 == 1,所以是false。
按求值顺序拆开(面试就这么讲)
!0; // true,因为 0 是 falsy
0 == true; // true -> 1
0 == 1; // false
对比记忆(容易混)
0 == false; // true(false -> 0)
0 == !0; // false(!0 -> true -> 1)
常见追问(顺带背)
Q1:那 [] == false 呢?
[] == false; // true
口述:
false -> 0[]是对象,先 ToPrimitive:[] -> """" -> 0- 所以
0 == 0为true
Q2:业务代码建议怎么写?
- 不要写
==去赌隐式转换结果。 - 需要判断“是否为 0”:用
x === 0。 - 需要判断“是否为 falsy”:用
if (!x)(并清楚 falsy 清单)。