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

问题描述 投票:0回答:3

如果空数组

[]
在 JavaScript 中是 falsy 那么为什么当用作三元运算符中的谓词时,运算符会评估为第一个选项?

console.log([] == false); // prints true
console.log([] ? 0 : 1);  // prints 0 !
javascript arrays
3个回答
47
投票

数组不是假的;这可以用

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

来证明

通过

==
操作数进行左右比较时,JavaScript 会尝试将输入强制为通用类型。

在第一个示例

[] == false
中,会发生以下情况:

  1. 发现右侧为
    Boolean
    ,因此将其转换为
    Number
    值,结果比较为
    [] == 0
  2. 由于左侧是
    Object
    ,因此它被转换为基元;在这种情况下,通过
    String
    得到
    [].toString()
    ,导致比较结果为
    "" == 0
  3. 由于左侧是
    String
    ,因此它会转换为
    number
    值,从而得到
    0 == 0
  4. 由于双方都是
    Number
    原语,因此比较它们的值,从而得出真实条件

对于

[] ? 0 : 1
的第二个示例,没有右侧值可供比较,因此它只是测试输入是否为真。该数组不是
undefined
null
0
""
NaN
,因此它被视为 true,因此返回 'true' 选项:
0
;

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

===
操作数。

Ecma 标准第 6 版关于强制的条目
JS 强制解释


2
投票

只是为了记住。

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

  1. 严格

    ===
    :检查类型和值

  2. 类型转换:

    ==
    仅检查值。

尝试这些并检查结果:

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

我希望它有帮助。


2
投票

添加上述答案..

要获取任何值的真实布尔值,您可以在其前面加上

!!
(这样您就不会遇到任何强制问题);

根据您的情况,您可以这样做:

console.log(!![] == false)   //logs false
© www.soinside.com 2019 - 2024. All rights reserved.