真真假假 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 时,可能会带来一些帮助。