MST

星途 面试题库

面试题:JavaScript 复杂逻辑表达式性能优化

假设有一个复杂的 JavaScript 逻辑表达式,涉及多个函数调用和变量判断,例如 `func1() && func2() || func3() && func4()`,其中 `func1`、`func2`、`func3`、`func4` 都是比较耗时的函数。如何在不改变逻辑结果的前提下,优化这个表达式的性能?阐述你的优化思路并给出可能的代码实现。
45.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 短路求值利用:JavaScript 的逻辑运算符 &&|| 具有短路求值特性。对于 &&,如果第一个操作数为 false,则不会计算第二个操作数;对于 ||,如果第一个操作数为 true,则不会计算第二个操作数。我们可以根据函数返回值的特点,合理安排函数顺序,让有可能提前结束表达式计算的函数排在前面。
  2. 缓存结果:由于这些函数比较耗时,我们可以将函数的返回值进行缓存,避免重复调用。

代码实现

// 缓存对象
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();

在上述代码中:

  1. 首先定义了一个 cache 对象用于缓存函数返回值。
  2. memoize 函数是一个高阶函数,它接收一个函数 func,返回一个新的函数。新函数会检查 cache 中是否已经有对应参数的计算结果,如果有则直接返回,否则调用原始函数并缓存结果。
  3. func1func2func3func4 进行 memoize 处理得到缓存版本的函数。
  4. 最后使用缓存后的函数构建逻辑表达式,利用短路求值和缓存机制优化性能。