This article is currently in the process of being translated into Chinese (~81% done).
Truthy & Falsy
在大多数编程语言中,乃至在数学中,“真(true)”和“假(false)”是完全二元的:某些事物要么是”真“的,要么是”假“的。但在JavaScript中,“真”和“假”的概念被扩展了一些,因为这门语言总体而言是相当宽松的且不像其他编程语言那么严谨。
在实际操作中,这表示有时JavaScript会将某些事物评价为“真”的或“假”的其中之一,尽管事实上它并不是完全“真”或“假”。这样做的目的仅仅是是为了能让事物变得更加简单和易处理的,但如果你不知道情况,或者时间太长忘记了,那这件事物可能会让你感到一些困惑。
因此,让我来为你介绍一个新的概念:真值和假值。它们仅仅作为一个概念存在,你既无法在JavaScript中找到一个属于它们的关键字,也无法找到一个与真值和假值相匹配的值。相反,JavaScript提出了一组运算符用于检测某件事物是否完全“真”的或“假”的,这些被称为严格运算符。例如严格相等运算符,当比较两个值时,需要使用三个等号而不是两个。
我们将在后续章节中讨论更多JavaScript的各种运算符,包括严格运算符。但目前我们先来讨论关于哪些是可以被认为是真值或假值的。
真值
在JavaScript中,除非被特别指定为假值,否则所有的值都是真值。当在某些语境中有需要时,JavaScript会使用强制类型转换将所使用的某些值转换为布尔值,比如一个循环或者一个if结构。举个例子,考虑在以下例子中的值,由于它们是真值,它们会被当做“真”来处理。
if(true)
alert("truthy");
if(42)
alert("truthy");
if("hello world")
alert("truthy");
如果你运行了这个例子,你会看到这三个if结构都得到了“真”,但为什么"hello world"是”真“?因为它包含了一个实际的值,然后JavaScript会在要求”真“或”假“的上下文中认为这是真值。
假值
一般而言,null、undefined或空值会被认为是假值,且当在一个布尔上下文中被使用时会被当成“假”对待,这里有几个例子:
if(false)
alert("falsy");
if(null)
alert("falsy");
if(0)
alert("falsy");
if("")
alert("falsy");
如果你运行了这个例子,你会注意到它们当中没有一个被触发,在这个语境中,以上所有的if结构都被认为是“假”的。
总结
当JavaScript需要某些事物是“真”的或“假”的时,如当评价一个循环或者if结构的条件时,它会采用强制类型转换,如果有需要的话,会将不是真正的布尔值的值转换为“真”或“假”。这种结果被称为真值和假值,因为当它们不是真正的“真”或“假”时,它们对于JavaScript来说足够接近去基于它们作出决定,如同这篇文章中的例子所证明的。