真值与假值
- 无、空、未定义、零等,一般被计算机认为是假;
- 有、非空、已定义、非零等,一般被计算机认为是真;
- 能够布尔转化为
true的值叫做真值,能够布尔转化为false的值叫做假值; - 能够布尔转化为
false的表达式的如下:null;NaN;0;- 空字符串(
""或''或 ``); - [];
undefined。
与(&&)
- 基本语法:
x && y; - 含义:(从左往右运算)如果 x 为假值就得到 x,否则得到 y;
- 可以级联:
x && y && z、x && y || z(与或级联); - 可以是值、表达式、语句(x, y, z);
- 优先级比或高;
- 特性:
- 从左往右,遇到真值继续向右执行、遇到假值立刻停止(假止)并返回;
- 全部为真值时,就得到最后一个数据或执行最后一个语句(取尾)。
1 && 0 && 100 // 0
1 && 10 && 100 // 100
a && b || c && d // 等价于 (a && b) || (c && d)
或(||)
- 基本语法:
x || y; - 含义:(从左往右运算)如果 x 为真值就得到 x,否则得到 y;
- 可以级联:
x || y || z、x || y && z(或与级联); - 可以是值、表达式、语句(x, y, z);
- 优先级比与低;
- 特性:
- 从左往右,遇到假值继续向右执行、遇到真值立刻停止(真止)并返回;
- 全部为假值时,就得到最后一个数据或执行最后一个语句(取尾)。
0 || 1 || '' // 1
0 || null || '' // ''
a && b || c && d // 等价于 (a && b) || (c && d)
非(!)
- 语法:
!x; - 含义:将 x 转换成布尔值后取反;
- 结果是一个布尔值;
- 比其他逻辑运算符优先级都高。
空值合并运算符(??)
意义
- 传统与或非都是将(表达式/值/语句)转成布尔值(
true/false),再进行逻辑运算; - 但是诸如
0、''、[]等会被转成false的数据,在很多场景下都是有效值,不应该被忽略; - 空值合并,只针对
null和undefined,所以不用转成布尔值,而是直接判断数据类型,进而运算。
使用
- 语法:
x ?? y; - 含义:(从左往右运算)如果 x 既不是
null也不是undefined就得到 x,否则得到 y; - 自级联:
x ?? y ?? z; - 可以是值、表达式、语句(x, y, z);
- 特性:和
||相似; - 注意:
??不能与&&、||混合级联使用,需要使用小括号错开优先级;- 常用于分配默认值,即给 x 分配默认值 y。
1 && 0 ?? 1 // 报错
(1 && 0) ?? 1 // 不报错
let onShowName;
onShowName = username ?? '匿名' // 当 username 为 null 或未定义时,显示 匿名
/* 下面是一个等效表达 */
onShowName = (username !== null && username !== undefined) ? username : onShowName;
使用与或代替条件语句
根据 &&、|| 的特性:
与代替单 if 语句:条件 && 语句1,当条件为真值时,继续执行语句1;或代替单 if 语句:条件 && 语句1,当条件为假值时,继续执行语句1;与或代替 if-else 语句:条件 && 语句1 || 语句2,当条件为真值时,执行语句1,否则执行语句2。
/* 一个比较大小的函数 */
function compare(a, b) { return a > b && a || b; }
/* 下面是一个等效表达 */
function compare(a, b) {
if (a > b) {
return a;
}
else {
return b;
}
}
本文详细介绍了编程中真值和假值的概念,以及布尔运算符(&&,||,!)的语法、优先级和级联特性。特别强调了空值合并运算符(??)在处理null和undefined时的优势,并展示了如何用逻辑运算代替条件语句,提高代码简洁性。

被折叠的 条评论
为什么被折叠?



