短路求值(short-circuit evaluation)是指在逻辑运算中,如果前面的表达式已经能够确定整个表达式的结果,后面的表达式就不会被执行。短路求值常见于逻辑运算符 &&
(与)和 ||
(或)中。
下面是几个关于短路求值的例子:
1. &&
(逻辑与)的短路求值
&&
表达式会在第一个操作数为 false
时停止计算,因为无论第二个操作数是什么,结果都一定是 false
。
// 示例 1:前面的表达式为 false,后面的表达式不会执行
const a = 0;
const result1 = a && (10 / a); // 0
console.log(result1); // 输出 0,因为 a 为 0,整个表达式短路,10 / a 不会被执行
// 示例 2:前面的表达式为 true,继续执行后面的表达式
const b = 5;
const result2 = b && (b + 10); // 15
console.log(result2); // 输出 15,因为 b 为 5,所以继续执行 b + 10
2. ||
(逻辑或)的短路求值
||
表达式会在第一个操作数为 true
时停止计算,因为无论第二个操作数是什么,结果都一定是 true
。
// 示例 1:前面的表达式为 true,后面的表达式不会执行
const c = 5;
const result3 = c || (10 / c); // 5
console.log(result3); // 输出 5,因为 c 为 5(true),整个表达式短路,10 / c 不会被执行
// 示例 2:前面的表达式为 false,继续执行后面的表达式
const d = 0;
const result4 = d || (d + 10); // 10
console.log(result4); // 输出 10,因为 d 为 0(false),所以继续执行 d + 10
3. 结合对象展开的例子
可以利用短路求值来有条件地向对象中添加属性:
const addAge = true;
const person = {
name: 'Alice',
...(addAge && { age: 25 })
};
console.log(person); // 输出 { name: 'Alice', age: 25 }
const addAge2 = false;
const person2 = {
name: 'Bob',
...(addAge2 && { age: 30 })
};
console.log(person2); // 输出 { name: 'Bob' }
4. 函数调用中的短路求值
短路求值还可以用于控制函数是否执行:
function greet() {
console.log('Hello, world!');
}
// 当 condition 为 true 时调用函数
const condition = true;
condition && greet(); // 输出 "Hello, world!"
// 当 condition 为 false 时,不调用函数
const condition2 = false;
condition2 && greet(); // 不会输出任何东西
5. 设置默认值
可以用短路求值来设置默认值:
const inputValue = null;
const defaultValue = '默认值';
const result5 = inputValue || defaultValue;
console.log(result5); // 输出 "默认值"
如果 inputValue
是 null
、undefined
、0
、false
或 ""
,那么 result5
会使用 defaultValue
作为默认值。