真真假假 JavaScript
- JavaScript 中所有的 Falsy 值
- Boolean 的显式转换
- Truthy 值的相互比较 (==, !=)
- Falsy 值的相互比较 (==, !=)
- Truthy 和 Falsy 值之间的相互比较 (==, !=)
- 总结
- 扩展阅读
- 参考文档
几乎在所有语言中,都会有用于表示真假的布尔(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] |
-0 与 0 不同,见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 值是不等(!=
,!==
)的。 -
null
和undefined
是相等(==
)的,与其他 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 时,可能会带来一些帮助。