面试题答案
一键面试优化思路
- 短路求值利用:JavaScript 的逻辑运算符
&&
和||
具有短路求值特性。对于&&
,如果第一个操作数为false
,则不会计算第二个操作数;对于||
,如果第一个操作数为true
,则不会计算第二个操作数。我们可以根据函数返回值的特点,合理安排函数顺序,让有可能提前结束表达式计算的函数排在前面。 - 缓存结果:由于这些函数比较耗时,我们可以将函数的返回值进行缓存,避免重复调用。
代码实现
// 缓存对象
const cache = {};
function memoize(func) {
return function() {
const key = JSON.stringify(arguments);
if (!cache[key]) {
cache[key] = func.apply(this, arguments);
}
return cache[key];
};
}
// 假设这是原来的函数
function func1() {
// 模拟耗时操作
for (let i = 0; i < 1000000; i++);
return true;
}
function func2() {
// 模拟耗时操作
for (let i = 0; i < 1000000; i++);
return true;
}
function func3() {
// 模拟耗时操作
for (let i = 0; i < 1000000; i++);
return true;
}
function func4() {
// 模拟耗时操作
for (let i = 0; i < 1000000; i++);
return true;
}
// 缓存后的函数
const memoizedFunc1 = memoize(func1);
const memoizedFunc2 = memoize(func2);
const memoizedFunc3 = memoize(func3);
const memoizedFunc4 = memoize(func4);
// 优化后的逻辑表达式
const result = memoizedFunc1() && memoizedFunc2() || memoizedFunc3() && memoizedFunc4();
在上述代码中:
- 首先定义了一个
cache
对象用于缓存函数返回值。 memoize
函数是一个高阶函数,它接收一个函数func
,返回一个新的函数。新函数会检查cache
中是否已经有对应参数的计算结果,如果有则直接返回,否则调用原始函数并缓存结果。- 对
func1
、func2
、func3
、func4
进行memoize
处理得到缓存版本的函数。 - 最后使用缓存后的函数构建逻辑表达式,利用短路求值和缓存机制优化性能。