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

时间:2015-11-06 12:46:45

标签: javascript arrays

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

console.log([] == false); // prints true
console.log([] ? 0 : 1);  // prints 0 !

3 个答案:

答案 0 :(得分:12)

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

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

  1. 发现右侧为Boolean,因此会将其转换为Number值,从而导致比较为[] == 0
  2. 由于左侧是Object,因此它被转换为基元;在这种情况下String通过[].toString(),导致比较为"" == 0
  3. 由于左侧是String,因此会转换为number值,从而产生0 == 0
  4. 由于双方都是Number原语,因此会对它们的值进行比较,从而产生条件
  5. 使用第二个表达式,没有比较的右手,所以它只是测试输入是否真实。该数组不是nullundefined0""NaN,因此,它是真实的。

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

    Ecma Standard 6th edition Entry on Coercion
    JS Coercion Explained

答案 1 :(得分:1)

添加上述答案..

获取任何值的真正布尔值,你可以用!!作为前缀(这样你就不会在任何强制问题中运行);

在你的情况下,你可以这样做:

console.log(!![] == false)   //logs false

答案 2 :(得分:0)

要记住。

Javascript有两种类型的比较运算符:

  1. 严格===:检查类型和值

  2. 类型转换:==仅检查值。

  3. 尝试这些并检查结果:

    console.log([] === false); //prints false console.log([] == false); //prints true console.log(0 == false); //prints true console.log(1 == "1") // prints true console.log(1 === "1") //prints false

    我希望它有所帮助。