MST

星途 面试题库

面试题:JavaScript 逻辑表达式优化在大型项目中的实践

在一个大型JavaScript项目中,有大量的逻辑判断分布在不同模块中,并且逻辑表达式涉及多个异步操作(如 `Promise`)。请描述一套通用的针对逻辑表达式优化的方案,包括如何在不影响业务逻辑正确性的前提下,提升整体的执行效率,以及如何处理异步操作在逻辑表达式中的短路求值情况。
42.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

1. 通用优化方案

  • 合并相似逻辑:在不同模块中查找相似的逻辑判断,将其提取到一个公共函数或模块中。这样不仅减少代码冗余,也方便统一维护和优化。例如,如果多个模块都在判断用户权限,可将权限判断逻辑封装成一个函数。
  • 减少不必要计算:对于逻辑表达式中结果不变的部分,将其计算结果缓存起来。比如在逻辑判断中,某些配置信息是固定不变的,提前获取并缓存该配置,避免每次逻辑判断都去读取配置。

2. 提升执行效率

  • 异步操作并行化:当逻辑表达式中有多个异步操作,且这些操作相互独立时,使用 Promise.all 并行执行这些异步操作。例如:
const promise1 = new Promise((resolve) => setTimeout(resolve, 1000, 'result1'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 1500, 'result2'));
Promise.all([promise1, promise2]).then((results) => {
    // 这里 results 是一个数组,包含所有 Promise 的 resolved 值
    console.log(results); 
});

这样可以充分利用等待异步操作的时间,提高整体执行效率。

  • 使用 async/await 使代码更易读async/await 语法糖让异步代码看起来像同步代码,更易于理解和维护。例如:
async function main() {
    try {
        const result1 = await new Promise((resolve) => setTimeout(resolve, 1000, 'result1'));
        const result2 = await new Promise((resolve) => setTimeout(resolve, 1500, 'result2'));
        console.log(result1, result2);
    } catch (error) {
        console.error(error);
    }
}
main();

3. 处理异步操作短路求值

  • 自定义短路函数:由于JavaScript原生逻辑运算符(&&||)不能直接对异步操作进行短路求值,我们可以自定义函数来实现。例如:
async function asyncAnd(...promises) {
    for (const promise of promises) {
        const result = await promise;
        if (!result) {
            return false;
        }
    }
    return true;
}
async function asyncOr(...promises) {
    for (const promise of promises) {
        const result = await promise;
        if (result) {
            return true;
        }
    }
    return false;
}

使用时:

const promise1 = new Promise((resolve) => setTimeout(resolve, 1000, true));
const promise2 = new Promise((resolve) => setTimeout(resolve, 1500, false));
asyncAnd(promise1, promise2).then((result) => console.log(result)); 
asyncOr(promise1, promise2).then((result) => console.log(result)); 
  • 利用 Promise.race 实现类似短路Promise.race 会返回第一个完成(resolved或rejected)的Promise的结果。可以利用它来实现类似逻辑或(||)的短路效果。例如:
function asyncOrWithRace(...promises) {
    return Promise.race(promises.map(p => p.then(Boolean).catch(() => false))).then(result => result);
}
const promise3 = new Promise((resolve) => setTimeout(resolve, 1000, true));
const promise4 = new Promise((resolve) => setTimeout(resolve, 1500, false));
asyncOrWithRace(promise3, promise4).then((result) => console.log(result)); 

这样可以在异步操作中模拟短路求值,提升逻辑表达式执行效率并确保业务逻辑正确性。