You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何空数组在不同上下文会映射为不同布尔值?

为什么空数组[]的布尔判断和==比较结果不一致?

这问题确实挺反直觉的,我刚接触JavaScript的时候也被这规则坑过!核心原因在于两种场景用了完全不同的类型转换规则,咱们拆开说:

1. 为什么if ([]) { ... }会执行代码?

当if语句判断条件时,JS会自动把条件值做布尔强制转换,也就是调用Boolean()函数来判断真假。

JS里只有6种"假值":null、undefined、false、0、''(空字符串)、NaN。空数组[]不在这个列表里,所以Boolean([])返回true,自然会执行if块里的代码,输出"Hello, world!"。

2. 为什么[] == false返回true?

这里用的是抽象相等运算符(==),它的类型转换规则和布尔强制转换完全不同,具体步骤是这样的:

  • 首先,抽象相等规则规定:如果其中一个操作数是布尔值,先把布尔值转换为数字:false转成0,true转成1。现在表达式变成[] == 0。
  • 接下来,一个操作数是对象(数组属于对象类型),另一个是数字,会把对象转换为原始值(调用ToPrimitive算法)。数组的ToPrimitive会先调用toString()方法,空数组的toString()返回''(空字符串)。现在表达式变成'' == 0。
  • 最后,字符串和数字比较时,把字符串转换为数字:空字符串''转成0。现在表达式变成0 == 0,结果自然是true。

补充:为什么[] == true不执行代码?

按照上面的转换逻辑,true会先转成1,表达式变成[] == 1;空数组转成''再转成0,最终是0 == 1,结果为false,所以不会执行对应的代码块。

内容的提问来源于stack exchange,提问作者frick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:13:09