为什么“ [] == true”和“![] == true”都为假?

时间:2019-10-06 07:23:48

标签: javascript

我有两个这样的陈述。为什么它们都求值为false

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

如果[] == truefalse![] == true是否应归于true

5 个答案:

答案 0 :(得分:7)

coercion的工作方式。

强制的第一步是将任何非原始类型转换为原始类型,然后使用一组规则将左侧,右侧或两侧转换为相同类型。您可以找到这些规则here

对于您的情况[] == true,将通过以下4个步骤:

  1. [] == true
  2. [] == 1
  3. "" == 1
  4. 0 == 1

首先执行基于operator precedence!中的![] == true,以便将表达式转换为显然是false == true的{​​{1}}。

您可以尝试live demoFelix Kling,以更好地了解相同性运算符的工作原理。

答案 1 :(得分:2)

按照抽象平等比较算法-http://es5.github.io/#x11.9.3

  

要检查 x == y 时要检查x和y的类型。

     

如果没有规则匹配,则返回false。

  1. 对于 [] == true ,规则7匹配,因此返回[] == ToNumber(true)的结果,即返回false
  2. 由于 ![] == true返回 ![] ,而false返回 false == true ,因此 false 的结果相同。
  

要在第二次操作中获得相反的结果,请使用大括号在表达式中添加优先级(即换行)。

console.log(!([] == true)); // returns true

答案 2 :(得分:1)

![]放入控制台。是false

因此![] == truefalse == true相同,即false

[] != truetrue

答案 3 :(得分:1)

到目前为止,没有一个答案解决了主要问题。 [编辑:这不再是事实。请参阅Nick Zoum的答案。]

问题本质上是这样的:

isModalInPresentation = true返回[] == true
=> false不是[]
=> true[](因为不正确的内容必须为假)
=> false应该是![],因为true的取反是false。那么为什么true返回![] == true


false实际上是真实的。 (所以[]实际上是虚假的。)

仍然,![]返回[] == true -原因是强制。这是Javascript的另一个陷阱。

在针对布尔值(即针对falsetrue)中显式检查数组是否相等时,其元素首先转换为字符串,然后连接在一起。因此,空数组变成false -这是问题所在,因为空字符串是虚假的。

简而言之,一个空数组是真实的,但是(与布尔值比较时)它被强制为一个空字符串,这是虚假的。

请注意以下内容,它们来自https://www.nfriedly.com/techblog/2009/07/advanced-javascript-operators-and-truthy-falsy/

  

数组特别奇怪。如果您仅测试其真实性,   空数组是真实的。但是,如果将空数组与   布尔值,它变得虚假:

""
  

(这是因为进行比较时,其元素将转换为Strings并进行连接。由于它为空,因此它变成了“”,然后变得虚假。是的,这很奇怪。)

答案 4 :(得分:0)

阅读https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

JavaScript中的等于运算符(==)的规则

如果


type(x)            type(y)                    result

1.x and y are the same type    See Strict Equality (===) Algorithm

2.null              Undefined                 true

3.Undefined           null                    true

4. Number            String                 x == toNumber(y)

5. String            Number                  toNumber(x) == y

6. Boolean           (any)                  toNumber(x) == y

7. (any)              Boolean               x == toNumber(y)

8.String or Number    Object                x == toPrimitive(y)

9.Object            String or Number          toPrimitive(x) == y

***10.otherwise…                                 false