1. 防抖、节流
在线代码实例 https://stackblitz.com/edit/web-platform-hw7nmu?file=script.js,index.html
防抖
概念:一定时间后,代码只执行一次,如果期间重复触发,则重新计时 使用场景:监听窗口大小改变、下拉输入请求接口等
function debounce(fn, time) {
let timer = null;
return function () {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(fn, time);
};
}
节流:一定时间内,代码只会执行一次 使用场景:监听滚动事件
function throttle(fn, time) {
let run = false;
return function () {
if (!run) {
setTimeout(() => {
fn();
run = false;
}, time);
run = true;
}
};
}
实现一个函数,将其中vA为true的对象提升,并删除vA属性,然后返回新对象,
如:
const obj = {
name: 'I',
color: 'pink',
objA: {
vA: true,
bg: 'blue',
objB: {
bg: 'yellow'
}
},
objC:{
vA: false,
bg: 'red'
}
}
function improveObj() {
...
return newObj;
}
console.log(improveObj(obj)); // { name: 'I', color: 'pink', bg: 'blue', objB: { bg: 'yellow' }, objC:{ vA: false, bg: 'red'}}
/**
* obj 为初始对象值
* k 为初始对象键名
*/
function improveObj(obj, k) {
let res = {};
let VAEqualTrue = false;
for (const key in obj) {
if (Object.prototype.toString.call(obj[key]) === '[object Object]') {
// 属性值为对象时,递归调用函数
const curValue = upgrade(obj[key], key);
res = { ...res, ...curValue };
}
else if (key === 'vA' && obj[key] === true) {
// 属性为vA并且值为true时,记一个flag
VAEqualTrue = true;
}
else {
// 将属性放入结果
res = { ...res, [key]: obj[key] };
}
}
if (!VAEqualTrue && k) {
return { k: res};
}
return res;
}