我目前正在学习JavaScript,我对此感到很困惑。
任何人都可以解释这是如何可能的:
"" || "word" // -> "word"
("word") && true // -> true
("" || "word") == true // -> false
我曾尝试在线搜索但无法找到恰当的词语来描述我的问题。
答案 0 :(得分:3)
中所述"" || "word" // -> "word"
逻辑或(
||
)
expr1 || expr2
如果可以转换为expr1
,则返回true
;否则,返回expr2
。
在这种情况下,第一个表达式""
is falsy,因此第二个术语是表达式的结果。如果第一个表达式是真的,那么第二个术语就不会被评估,第一个表达式将被返回。
中所述("word") && true // -> true
逻辑AND(
&&
)
expr1 && expr2
如果可以转换为expr1
,则返回false
;否则,返回expr2
。
这里第一个表达式是真实的,因此JavaScript返回最后一个。如果第一个是假的,那么返回值将是第一个术语。
("" || "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中的真相比true
或false
更多。
还有真实的价值观和虚假价值,一切都是真实的或虚假的。
false
,0
,""
,null
,undefined
和NaN
都是假的。
其他一切都是真的。
逻辑运算符在真实和虚假的事情上运作;
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中有thruthy
和falsey
值的概念。 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