为何空数组在不同上下文会映射为不同布尔值?
为什么空数组
[]的布尔判断和==比较结果不一致? 这问题确实挺反直觉的,我刚接触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
相关产品推荐
相关产品推荐

