[] == ![ ] 为 true,因 ![] 先转布尔 true 再取反得 false,[] == false 经对象→字符串→数字转换得 0 == 0;"0" == false 同样为 true,因 false 转 0、"0" 转 0。

这类题目表面是考相等判断,实际是在检验你对 JavaScript 隐式类型转换规则的掌握程度。关键不是死记结果,而是能一步步还原引擎内部的转换路径。
看清运算符优先级,先拆解表达式结构
比如 [] == ![],! 的优先级远高于 ==,所以第一步必须先算 ![]。而 ![] 的过程是:先将 [] 转为布尔值 → 得到 true(所有对象转布尔都是 true),再取反 → 得到 false。整个表达式就简化为 [] == false。
同理,"0" == false 中没有高优先级运算符干扰,直接进入 == 的类型协调流程。
记住 == 的核心原则:最终都转成数字比
当两个操作数类型不同时,== 会按固定顺序尝试转换,目标是让两边都变成 number 再比较:
- 如果一边是布尔值(如
false),先转成数字:false → 0,true → 1 - 如果一边是字符串(如
"0"或""),也转成数字:Number("0") → 0,Number("") → 0 - 如果一边是对象(如
[]),先调用toString()得到原始值([].toString() → ""),再按字符串规则转数字
动手推一遍 [] == ![] 的完整链路
从原始表达式开始,严格按步骤走:
-
[] == ![]→ 先算![]→!true→false - 变成
[] == false→ 布尔转数字:false → 0→[] == 0 - 对象与数字比 → 对象转原始值:
[].toString() → ""→"" == 0 - 字符串与数字比 → 字符串转数字:
Number("") → 0→0 == 0→true
"0" == false 的链路更短但容易掉坑
有人误以为字符串 "0" 是真值所以不等于 false,其实完全走另一条路:
-
"0" == false→ 布尔转数字:false → 0→"0" == 0 - 字符串与数字比 →
Number("0") → 0→0 == 0→true - 注意:
"0"不是空字符串,但它能被Number()正确解析为0,所以结果是true
真正要警惕的是那些转换后不是 0 的情况,比如 "1" == true 是 true,但 "2" == true 就是 false——因为 Number("2") === 2,而 2 != 1。










