Menu

JavaScript 真值与假值:完整列表

JavaScript 中哪些值是真值、哪些是假值,假值的完整列表,以及布尔转换在真实代码中是怎样发生的。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

每个值都有自己的布尔倾向

JavaScript 允许你把任何值放在需要布尔值的地方:if 里面、while 的条件中、&& 或 || 旁边。这时这个值会被转换成 true 或 false。转换为 false 的值叫作假值(falsy),其他所有值都是真值(truthy)。

不需要转换函数,也不需要显式转型,JavaScript 会自动完成。规则是固定的,而且很少,所以只要知道了假值列表,其他情况都能推出来。

完整的假值列表

正好有八个值是假值。语言中其他一切都是真值。

就这些。列表如下:

  • false:布尔值本身。
  • 0 和 -0:两个零。
  • 0n:BigInt 零。
  • "":空字符串(单引号、双引号或反引号都一样)。
  • null:表示“有意为空”的值。
  • undefined:表示“尚未设置”的值。
  • NaN:像 0 / 0 这样的无效运算的结果。

记住这八个。以后遇到拿不准的值,就问自己:“它是这八个之一吗?”如果不是,它就是真值。

意外情况:"0"、[] 和 {}

初学者在这里最容易栽跟头。很多值看起来是空的,其实是真值:

字符串只有在一个字符都没有时才是假值。"0" 有一个字符,所以是真值。数组和对象永远是真值,即使是空的也一样,因为 JavaScript 把它们当作对象,而所有对象不管里面有什么都是真值。

如果你是从 Python 转过来的,这是最需要转变的观念。在 Python 中,[] 和 {} 是假值;在 JavaScript 中不是。

正确地判断“空”

因为 [] 和 {} 是真值,你不能直接把它们放进 if 来判断是否为空。要写得明确一些:

字符串也一样,如果你想把只包含空白的字符串视为空:

真值与假值是一种方便的简写,但它不能代替你去思考“空”对你的数据意味着什么。

转换成真正的布尔值

有时你需要真正的 true 或 false,而不只是一个“像真值”的值。有两种惯用写法:

Boolean(x) 是显式转换。!!x 是同一件事的简写:第一个 ! 把值转换成布尔值并取反,第二个 ! 再翻转回来。两种都很常见。!! 更短,Boolean() 更易读。

在函数需要返回一个干净布尔值的 return 语句中,你会经常看到 !!:

&& 和 || 中的真值与假值

逻辑运算符返回的不是 true 或 false,而是其中一个操作数。返回哪一个,取决于真假:

这就是为什么 value || defaultValue 是设置默认值的常用写法。但它有一个陷阱:它把所有假值一视同仁,包括 0 和 "",而它们常常是有效的输入:

如果你只想在值为 null 或 undefined 时使用默认值,请改用空值合并运算符 ??。它有单独的文档介绍。

速查表

打印出来,贴在显示器上,然后就可以继续往下学了。

下一节:迭代器与生成器

掌握了条件语句和循环之后,下一章我们来看 JavaScript 如何让值按需生成。迭代器和生成器是 for...of、展开语法和许多现代 API 背后的机制,接下来就讲它们。

常见问题

JavaScript 中的假值有哪些?

一共正好八个:false、0、-0、0n(BigInt 零)、''(空字符串)、null、undefined 和 NaN。其他一切都是真值,包括 '0'、'false'、[] 和 {}。记住这份简短的假值列表,其他任何值都能用排除法得出答案。

JavaScript 中空数组是真值还是假值?

是真值。if ([]) { ... } 会执行代码块,这让从 Python 或 PHP 转过来的人很意外。数组和对象都是对象,而所有对象不管里面有什么都是真值。要判断数组是否为空,请显式地使用 arr.length === 0。

如何在 JavaScript 中把一个值转换成布尔值?

有两种方法:Boolean(value) 是显式写法,!!value 是简写(两次取反,先转换再翻转回来)。两者遵循同样的真值与假值规则。当你需要真正的 true 或 false,而不只是一个“像真值”的结果时,就用它们。

Coddy 编程语言插图

和 Coddy 一起学编程

开始