JavaScript中的truthy和falsy与true和false有什么区别?

11
我有一个关于JavaScript中某些概念(如“truthy,true”和“falsy,false”)的问题。
我知道1的类型不是“true”,但问题是:为什么“1 == true”?
ECMAScript将1或“ghsagh”视为“true”的主要原因是什么?
我也不理解“truthy”和“falsy”的含义。
这种考虑的好处是什么?

3
可能是与JavaScript中的相等运算符(== vs ===)有何区别?重复的问题。 - DarkDust
1
https://dev59.com/Z3RC5IYBdhLWcg3wROpQ#359509 - R3tep
2
https://dev59.com/s2sz5IYBdhLWcg3w3bpb - epascarello
2
通过这些评论,我确信没有人正确阅读我的问题! 我知道“==”和“===”之间的区别。问题在于 truthy 和 falsy 的含义。 - Amir Jalilifard
1
你的“为什么”有两个答案:因为设计者选择以这种方式指定。但是他们为什么选择这样指定,我们只能猜测;在许多情况下它很有用。 - DarkDust
显示剩余8条评论
2个回答

6
JavaScript 喜欢在可能的情况下将值隐式转换为其他类型。因此,当将布尔值与其他类型的变量进行比较时,JavaScript 使用与早期编程语言相同的逻辑。表示空、null 或零的值(例如 0 或 "")会计算为 false,而任何其他值(例如 1、5、-19、"ghsfsah" 或其他有意义的内容)都会计算为 true。
为什么会这样做呢?首先,它允许开发人员在检查变量是否具有内容时使用一个小快捷方式。例如,如果用户没有在文本字段中输入内容,我们可以轻松地检查该字段是否为空并提示用户。
if ( !textfield.value ) {
    alert( "Please enter something in the text box" );
}

如果您需要判断某个东西是否确实是truefalse,您可以使用===


1
谢谢。我只是不明白为什么我得到了-6分!因为我认为应该有人问这个问题! - Amir Jalilifard
2
@AmirJalilifard:我认为问题在于你的问题被理解为“为什么语言认为‘1’是真实的”(因为它是这样指定的),而不是“为什么语言设计者要这样指定”。直到你澄清之前,我确实是按照第一种意义来解释它的。 - DarkDust
@DarkDust 是的。也许一开始并不是很清楚,但如果大家一直读到最后,他们就会明白我的意思。你知道,我还记得曾经问过一个关于“领域特定语言”和“框架”之间区别的问题。那些人给了我-8分,只是因为他们认为那个问题没有用。但是三周后,他们意识到那个问题很重要,然而我失去了两个月的提问权限。无论如何,谢谢你的回答。祝好运。 - Amir Jalilifard
1
永远不要低估StackOverflow误解你问题的能力。尽可能清晰明了地表达,然后再更加明确。 - David Reeve

2

JavaScript对所需值的类型非常灵活。如果JavaScript需要布尔值,它将把您提供的任何值转换为布尔值。

一些值(“真值”)转换为true,而其他值(“假值”)转换为false。

以下值转换为false,并因此像false一样工作:

  1. undefined
  2. null
  3. 0
  4. -0
  5. NaN
  6. "" // 空字符串

所有其他值,包括所有对象(和数组),都转换为并像true一样工作。

例如,假设变量o保存一个对象或值null。您可以使用if语句显式测试o是否为非null,如下所示:

最初的回答:

if (o !== null){
....
}

严格不等于运算符!==会将onull进行比较,并返回true或false。但你可以省略比较操作,而是依靠null为假值,对象为真值的事实: "最初的回答"
if (o){
....
}

在第一种情况下,只有当o不是null时才会执行if语句块。因此,即使将o设置为undefined,代码块也会执行。
第二种情况较为宽松:只有当o不是false或任何假值(如nullundefined)时,才会执行if语句块。哪个if语句适用于您的程序,实际上取决于您期望分配给o的值。如果您需要区分null0以及"",则应使用显式比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接