讲解
布尔类型只有两个值:true 和 false,是条件判断、循环控制的根基。比较运算(>、=== 等)和逻辑运算的结果都是布尔值。任何值都可以放进 if 的条件里——JavaScript 会先做「真假值」判定:false、0、-0、0n、''、null、undefined、NaN 这几个是假值(falsy),其余全部是真值(truthy),包括空数组、空对象和字符串 '0'。
逻辑运算符 &&、||、! 的行为要再强调一遍:! 把值转成布尔后取反,!!value 是把任意值转成布尔值的快捷写法(等价 Boolean(value));&& 从左往右遇到第一个假值就返回它,全为真则返回最后一个值;|| 遇到第一个真值就返回它,全为假则返回最后一个值。它们都有短路特性:结果确定后右边的表达式不再执行,所以 config && load(config) 这种写法在 config 为空时不会调用 load。
实践中布尔值最重要的场景是命名和判断风格:表示布尔的变量用 is/has/can/should 开头(isLogin、hasPermission),读起来像自然语言的问句;判断条件里避免写 if (isReady === true) 这种冗余,直接 if (isReady);反过来,判断一个数字是否非零、字符串是否非空时,显式写出比较(count > 0、name !== '')比依赖真假值转换更可读。
示例
// 真假值判定
const values = [0, 1, '', '0', null, [], {}, NaN];
for (const v of values) {
console.log(JSON.stringify(v) ?? String(v), '=>', Boolean(v));
}
// 短路求值
let called = false;
const config = null;
config && (called = true); // config 为 null,右边不执行
console.log('右侧执行了吗:', called);
// !! 与 Boolean 等价
console.log(!!'hello', Boolean('hello'), !!0);
// 好的布尔命名
const isAdult = (age) => age >= 18;
console.log('18 岁成年吗:', isAdult(18), ',16 岁呢:', isAdult(16));
常见坑
- 以为空数组/空对象是假值:[] 和 {} 都是真值。判断数组为空要用 arr.length === 0。
- 字符串 'false' 是真值:从 URL 参数或 localStorage 读出的 'false' 是非空字符串,if ('false') 会进入分支,要先做解析。
- && 链里返回值不是布尔:a && b 返回的是操作数本身,把它当纯布尔用(比如存进状态)时最好包一层 Boolean()。
- 用 !value 判断「没有值」误伤 0 和 '':!count 在 count 为 0 时也为真,要区分「空」和「零」请用 value == null(这是 == 唯一被广泛接受的用法,同时匹配 null 和 undefined)。
小结
布尔值驱动所有分支逻辑;记住假值清单,其余皆真。&&/|| 返回操作数且有短路特性。下一节专门辨析两个最容易混淆的值:null 和 undefined。