面试题答案
一键面试纯函数的两个主要特性
- 相同输入,相同输出:无论何时调用,只要传入的参数相同,纯函数总会返回相同的结果。它不依赖于外部状态,也不会被外部状态所影响。例如:
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5,每次调用,只要参数相同,结果就相同
- 无副作用:纯函数不会对外部环境产生可观察的变化,如修改全局变量、发起网络请求、操作 DOM 等。例如,以下函数就有副作用,因为它修改了全局变量:
let count = 0;
function increment() {
count++;
return count;
}
而纯函数版本则不会:
function increment(count) {
return count + 1;
}
let initialCount = 0;
let newCount = increment(initialCount);
// initialCount 未被修改,新值通过返回值获取
实际项目中的应用场景
- 数据处理:在数据映射、过滤和归约等操作中非常有用。例如,使用
map
方法处理数组数据:
const numbers = [1, 2, 3, 4];
const squaredNumbers = numbers.map(num => num * num);
// squaredNumbers: [1, 4, 9, 16]
// map 方法的回调函数是纯函数,对每个元素执行相同操作,不影响外部状态
- 数据缓存:由于纯函数相同输入总是返回相同输出,可以方便地进行缓存。比如使用
lodash
库中的memoize
方法来缓存纯函数的结果:
import _ from 'lodash';
function expensiveCalculation(a, b) {
// 假设这里有复杂的计算逻辑
return a + b;
}
const memoizedCalculation = _.memoize(expensiveCalculation);
console.log(memoizedCalculation(2, 3)); // 第一次调用,执行计算
console.log(memoizedCalculation(2, 3)); // 第二次调用,直接返回缓存结果,提高性能
- 测试:纯函数易于测试,因为不需要考虑外部状态的影响。例如:
function multiply(a, b) {
return a * b;
}
// 测试时只需要关注输入和输出
import { expect } from 'chai';
describe('multiply function', () => {
it('should multiply two numbers correctly', () => {
expect(multiply(2, 3)).to.equal(6);
});
});