面试题答案
一键面试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));
这样可以在异步操作中模拟短路求值,提升逻辑表达式执行效率并确保业务逻辑正确性。