为什么`("" || "word") == true` returns false?

Why `("" || "word") == true` returns false?

我正在学习JavaScript,对此我真的很困惑。

谁能解释这是怎么可能的:

"" || "word" // -> "word"

("word") && true // -> true

("" || "word") == true // -> false

我尝试在线搜索,但找不到合适的词来描述我的问题。

JavaScript 比 truefalse 更真实。

也有真值和假值之分,非真即假。

false0""nullundefinedNaN 是假的。
其他都是真的。

逻辑运算符对真实和虚假的事物进行运算;

a && b

  • a,如果 a 是假的
  • 否则就是b

a || b

  • a,如果 a 是真实的
  • 否则就是b

(如果您熟悉 Lisp 或 Python,这很自然。如果您不熟悉,您可能会想 "WAT?!"。)

因此,

"" || "word"  -> "word"

因为""是假的,

"word" && true  -> true

因为 "word" 是真实的,并且

("" || "word") == true  -> false

因为"" || "word""word",而"word"true不是同一个对象。

我假设你理解前两个布尔值,但对最后一个有点困惑。

你的问题是,如果前 2 个是 true,为什么最后一个不是 true

Javascript中有thruthyfalsey值的概念。 thruthy 值可能是也可能不是 Boolean,但仍满足 if 条件。

例如,对于字符串,空字符串是 falsey 值,即使只有一个字符的字符串也是 thruthy.

A truthy 等于 true,但不 等于 true . falsey.

相同

在最后一种情况下,("" || "word") == true,左边部分等于word,并且使用的运算符==检查左边的值是否等于右边的值。所以 word 不等于 true,因此 returns false.

("" || "word") == true // lets simplify
"word" == true // false, "word" is not equal to true

但是如果您在 if 条件下使用 word,它将满足条件,因为它是一个 thruthy 值。

if ("word") { /* condition will be satisfied */ }
if ("") { /* condition will NOT be satisfied */ }

要检查值是否为 truthy,请在值前使用 !!

// String
!!"word" // true
!!""     // false
// Number
!!5      // true
!!0      // false
// Boolean
!!true   // true
!!false  // false

1。问题 1

"" || "word"  // -> "word"

documentation on ||所述:

Logical OR (||)
expr1 || expr2
Returns expr1 if it can be converted to true; otherwise, returns expr2.

在这种情况下,第一个表达式"" is falsy,因此第二项是表达式的结果。如果第一个表达式为真,则不会计算第二项,而第一项将被 returned.

2。问题 2

("word") && true // -> true

documentation on &&所述:

Logical AND (&&)
expr1 && expr2
Returns expr1 if it can be converted to false; otherwise, returns expr2.

此处第一个表达式为真,因此 JavaScript return 为最后一个。如果第一个是假的,那么 return 值就是第一个词。

3。问题 3

("" || "word") == true // -> false

根据第一个表达式结果,这相当于:

"word" == true // -> false

对于 == 运算符,强制转换的方式不同。 true is coerced into a string value,即"1",显然与"word"不同。如果第一项是 "1" 或只是 1,它会产生 true:

"1" == true // -> true
1 == true // -> true

实际使用

如果你有像上一个这样的条件,直接写就可以了:

if ("" || "word") {
    console.log('it is truthy!');
}

或者如果您确实需要 true 作为结果,请将其显式转换为布尔值 with !!:

result = !!("" || "word");