跳到主要内容

0 == !0 结果是什么?为什么?

面试速答(30 秒版 TL;DR)

  • 结果:false
  • 原因:!0 先走 ToBoolean 得到 true,然后 0 == truetrue 会被转成数字 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 == 0true

Q2:业务代码建议怎么写?

  • 不要写 == 去赌隐式转换结果。
  • 需要判断“是否为 0”:用 x === 0
  • 需要判断“是否为 falsy”:用 if (!x)(并清楚 falsy 清单)。