面试题答案
一键面试逻辑与(&&)求值策略
- 短路求值:逻辑与(&&)表达式从左到右求值。如果第一个操作数转换为布尔值为
false
,则返回第一个操作数,不会再对第二个操作数求值。只有当第一个操作数转换为布尔值为true
时,才会继续对第二个操作数求值,并返回第二个操作数。 - 示例:
let a = 0;
let b = 'hello';
let result1 = a && b; // 因为 0 转换为布尔值是 false,所以 result1 = 0,不会再计算 b
let c = 5;
let d = 'world';
let result2 = c && d; // 因为 5 转换为布尔值是 true,所以 result2 = 'world'
逻辑或(||)求值策略
- 短路求值:逻辑或(||)表达式同样从左到右求值。如果第一个操作数转换为布尔值为
true
,则返回第一个操作数,不会再对第二个操作数求值。只有当第一个操作数转换为布尔值为false
时,才会继续对第二个操作数求值,并返回第二个操作数。 - 示例:
let e = 10;
let f = 'test';
let result3 = e || f; // 因为 10 转换为布尔值是 true,所以 result3 = 10,不会再计算 f
let g = '';
let h = 'default';
let result4 = g || h; // 因为 '' 转换为布尔值是 false,所以 result4 = 'default'
对性能的影响
- 减少不必要计算:这种短路求值策略可以避免不必要的计算,提高性能。例如在逻辑与(&&)表达式中,如果第一个操作数已经能决定整个表达式的结果(为
false
),就不会去计算第二个操作数,从而节省了计算资源。同样,逻辑或(||)表达式中,如果第一个操作数能决定结果(为true
),也会停止后续计算。 - 函数调用场景:当操作数是函数调用时,短路求值的性能优化效果更为明显。例如:
function expensiveCalculation1() {
console.log('Calculating 1...');
return true;
}
function expensiveCalculation2() {
console.log('Calculating 2...');
return false;
}
let result5 = expensiveCalculation1() && expensiveCalculation2();
// 输出:Calculating 1... Calculating 2...,因为第一个函数返回 true,所以第二个函数仍会执行
let result6 = expensiveCalculation2() && expensiveCalculation1();
// 输出:Calculating 2...,因为第一个函数返回 false,第二个函数不会执行,节省了计算开销
let result7 = expensiveCalculation1() || expensiveCalculation2();
// 输出:Calculating 1...,因为第一个函数返回 true,第二个函数不会执行
let result8 = expensiveCalculation2() || expensiveCalculation1();
// 输出:Calculating 2... Calculating 1...,因为第一个函数返回 false,第二个函数会执行
在这些例子中,可以看到短路求值避免了不必要的函数调用,提升了性能。