几乎在所有语言中,都会有用于表示真假的布尔(Boolean)类型,并有真(true)假(false)两种值,JavaScript 也是如此。另外,当一些非布尔类型的值用在 if 判断,? : 条件(三元)运算符,逻辑运算(&&, ||, !)等语句中时,也会被转换为真(true)或是假(false)。如果该值被会转换为真,我们就认为该值是真值(truthy 值),反之,则认为该值为非真值或假值(falsy 值)。

JavaScript 中所有的 Falsy 值

在 JavaScript 有以下值为假值 (falsy):

类型
(typeof)
类型
(Object.prototype.toString.call())
false boolean [object Boolean]  
0 number [object Number] 或写做 +0
-0 number [object Number] -00 不同,见1, 2, 3
NaN number [object Number] Not a Number
"" string [object String] 或写做 ''
null object [object Null]  
undefined undefined [object Undefined]  
document.all undefined [object HTMLAllCollection] 4, 5, 6, 7

除了在上表中列出的值外,其余的所有值都被视做真值 (truthy)。如:

类型
(typeof)
类型
(Object.prototype.toString.call())
"0" string [object String] 字符串 0
"false" string [object String] 字符串 false
{} object [object Object] 空对象
[] object [object Array] 空数组
new Boolean(false) object [object Boolean] Boolean 对象
new String("") object [object String] String 对象
Infinity number [object Number]  
function(){} function [object Function]  

Boolean 的显式转换

有时候我们需要将非布尔类型的值转换为布尔类型,那么可以用以下两种方法:

var foo;

// 方法 1:
// 使用 Boolean 函数来对变量进行类型转换。
// 使用此法将变量转换为布尔类型非常直观。
Boolean(foo)

// 方法 2:
// 使用 ! 运算符得到变量的布尔值的反,再次应用 ! 运算符可以得到变量对应的布尔值。
// 使用此法书写简洁,不过不如方法 1 来得直观。
!!foo

Truthy 值的相互比较 (==, !=)

不同 truthy 值之间的相互比较一般都是不相等的,如

true != 'true'

true, 1, "1", [1], [[1]] 之间是相等(==)的。

另有如下比较是相等的:

-1 == "-1"

[true] == "true"
[false] == "false"
[true, false] == "true,false"

Falsy 值的相互比较 (==, !=)

在 Falsy 值中,我们有

  • false, 0, -0, "" 是相互相等(==)的,但与其他 falsy 值是不等(!=, !==)的。

  • nullundefined 是相等(==)的,与其他 falsy 值是不等(!=, !==)的。

  • NaN 与所有值,包括 NaN 本身,都是不等(!=, !==)的。

false == 0
false == ""
0 == ""

null == undefined
false != null
false != undefined

NaN != NaN
NaN != false
NaN != null
NaN != undefined

Truthy 和 Falsy 值之间的相互比较 (==, !=)

只凭想象,似乎 truthy 值和 falsy 值相互比较的结果一定是 false,但是需要注意的是,此处是有例外的:

  • []是 Truthy 值,但与 false, 0, -0"" 这些 Falsy 值相比时却是相等(==)的。
  • [0]是 Truthy 值,但与 false, 0, -0 这些 Falsy 值以及 "0" 这一 Truthy 值相比时却是相等(==)的。
!![] === true

[] == false
[] == 0
[] == -0
[] == ""

总结

上文介绍列举了所有的 falsy 值和一些容易搞错的 truthy 值,也给出了将一个变量显式转换为布尔类型的方法,这些在日常开发中都属于基础知识。

除此之外,也给出了一些 truthy 值,falsy 值之间的相互比较的结果,这些内容在日常开发中用到的可能稍少一些,但是有了这些相应的了解之后,在处理一些奇怪特别的 bug 时,可能会带来一些帮助。

扩展阅读

参考文档