前端面试题
一、实现一个斐波拉契数列函数,接受参数为n,返回数列第n项的值,并且要做缓存处理。
思路:[1,1,2,3,5,8...],从第3(即数组下标为2)项开始,每项都是前两项数之和,这样的数列成为斐波拉契数列。所以,求第n项的值,那就从第n项开始,使用递归逐渐往前面计算。
const arr = []; //定义数组做缓存使用,每次计算的结果存入arr
function feb(n) {
if(n === 0) return 0;
if(n === 1 || n === 2) return 1;
//每次计算时对数组做判断,看第n项的结果是否已经存入数组中了,如果是,直接返回数组存储的结果并提前结束了递归
if(arr[n]) return arr[n];
arr[n] = feb(n - 2) + feb(n - 1);
return arr[n];
}
二、节流和防抖
- 节流:规定某个操作多久执行一次,例如鼠标滚动,只要滚动就会无限触发滚动事件,这是一种浪费,我们不需要触发这么多次。
let canMove = true; function saveTrigger() { if (!canMove) return; canMove = false; console.log(1); setTimeout(() => { canMove = true; }, 300) }虽然只要滚动就会无限触发saveTrigger事件,但是仍然300ms才会打印一次。
- 防抖:多长时间内连续触发一个事件时,不执行相关绑定事件。直到确认停止触发后再去执行事件函数。
let timer = null; function preventShaking(){ if (timer) { clearTimeout(timer); } timer = setTimeout(() => { console.log(1) }, 300); }
当每次触发时间间隔300ms以内时,清除了相关执行。只有停止触发300ms之后,才执行相关操作。
三、深拷贝
function deepCopy(data){
if (!data || typeof data !== 'object') return data;
let copyData = null;
if (data instanceof Array) {
copyData = [];
} else {
copyData = {};
}
for(let key in data) {
copyData[key] = deepCopy(data[key]);
}
return copyData;
}

浙公网安备 33010602011771号