空数组是假的,但是[]?0:1的计算结果为0

Mar*_*tus 5 javascript arrays

如果空数组在JavaScript中[]假的,那么为什么当用作三元运算符中的谓词时,运算符会逃避第一个选项?

console.log([] == false); // prints true
console.log([] ? 0 : 1);  // prints 0 !
Run Code Online (Sandbox Code Playgroud)

SRe*_*ect 14

首先,空数组不是假的,要获得实际的布尔值前缀,!!例如:console.log(!![]) // true

你从第一次比较得到的结果是由于强制.当通过==操作数进行左对比比较时,JavaScript会尝试将输入强制转换为公共类型,如下所示:

  1. 发现右侧是Boolean如此,它被转换为一个Number值,导致比较[] == 0.
  2. 由于左侧是一个Object它被转换为原始; 在这种情况下是一个String通道[].toString(),导致比较"" == 0.
  3. 由于左侧是a String,它将转换为number导致的值0 == 0.
  4. 由于两边都是Number原始的,因此将它们的值进行比较,从而产生真实的条件

使用第二个表达式,没有比较的右手,所以它只是测试输入是否真实.所述阵列并不null,undefined,0,""NaN,因此,它是truthy.

要强制在两个输入之间进行非强制比较,您应该使用===操作数.

Ecma标准第6版进入强制
JS强制解释

  • 亲爱的 JS,我不喜欢这个:(这么多的幕后强迫来咬我的屁股 (6认同)