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

时间:2017-01-02 09:50:18

标签: javascript logical-operators boolean-logic

我目前正在学习JavaScript,我对此感到很困惑。

任何人都可以解释这是如何可能的:

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

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

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

我曾尝试在线搜索但无法找到恰当的词语来描述我的问题。

3 个答案:

答案 0 :(得分:3)

1。问题1

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

documentation on ||

中所述
  

逻辑或(||
  expr1 || expr2
  如果可以转换为expr1,则返回true;否则,返回expr2

在这种情况下,第一个表达式"" is falsy,因此第二个术语是表达式的结果。如果第一个表达式是真的,那么第二个术语就不会被评估,第一个表达式将被返回。

2。问题2

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

documentation on &&

中所述
  

逻辑AND(&&
  expr1 && expr2
  如果可以转换为expr1,则返回false;否则,返回expr2

这里第一个表达式是真实的,因此JavaScript返回最后一个。如果第一个是假的,那么返回值将是第一个术语。

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");

答案 1 :(得分:2)

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 :(得分:1)

我假设您理解前两个布尔值,并且在最后一个布尔值中有一些混淆。

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

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

例如,在字符串的情况下,空字符串是falsey值,甚至包含单个字符的字符串是thruthy

truthy等效true,但等于true。与falsey相同。

在最后一种情况下,("" || "word") == true,左侧部分等于word,并且使用的运算符==检查左侧值是否等于正确值。因此word不等于true,因此返回false

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

但是如果您在word条件下使用if,它将满足条件,因为它是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