当前位置: 首页 > news >正文

js防抖、节流和扁平化实现

下面是 JavaScript 中常见的三个面试高频考点:


✅ 一、防抖(Debounce)

📌 场景:

  • 例如搜索输入框,每次输入触发搜索太频繁;

  • 希望用户停止操作后一段时间再触发函数

✅ 实现方式:

function debounce(fn, delay = 300) {let timer = null;return function (...args) {clearTimeout(timer);timer = setTimeout(() => {fn.apply(this, args);}, delay);};
}

✅ 使用方式:

window.addEventListener('resize', debounce(() => {console.log('窗口大小变化,执行逻辑');
}, 500));

✅ 二、节流(Throttle)

📌 场景:

  • 例如滚动监听、按钮点击,频繁触发但希望控制执行频率

  • 比如希望每 500ms 执行一次即可。

✅ 时间戳实现:

function throttle(fn, delay = 300) {let lastTime = 0;return function (...args) {const now = Date.now();if (now - lastTime > delay) {lastTime = now;fn.apply(this, args);}};
}

✅ 使用方式:

document.addEventListener('scroll', throttle(() => {console.log('节流执行 scroll');
}, 200));

✅ 三、数组扁平化(Flatten Array)

📌 场景:

  • 嵌套数组 [1, [2, [3, [4]]]] 要变成 [1, 2, 3, 4]


✅ 方法 1:递归实现

function flatten(arr) {return arr.reduce((acc, val) =>Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []);
}

✅ 方法 2:flat(Infinity)(ES10 简洁)

const arr = [1, [2, [3, [4]]]];
const result = arr.flat(Infinity);

✅ 方法 3:迭代 + 栈实现(不使用递归)

function flatten(arr) {const stack = [...arr];const result = [];while (stack.length) {const item = stack.pop();if (Array.isArray(item)) {stack.push(...item);} else {result.unshift(item); // 反顺序需要 unshift}}return result;
}

✅ 总结对比

技术适用场景核心原理
防抖停止输入后再处理每次都清定时器
节流控制频繁触发频率设置时间戳或定时器
扁平化处理嵌套数组递归 / ES10 flat / 栈

http://www.dtcms.com/a/308997.html

相关文章:

  • 链特异性文库是什么?为什么它在转录组测序中越来越重要?
  • 【Kubernetes 指南】基础入门——Kubernetes 201(三)
  • 第13届蓝桥杯C++青少组中/高级组选拔赛2022年3月13日真题
  • pdw估计edw怎么估计
  • 数据结构: 双向链表
  • Servlet修改新增思路
  • 数据大集网:引领精准获客新时代的优质平台
  • 数据结构:多项式加法(Polynomial Addition)
  • 从零开始搞定类和对象(上)
  • Python 环境配置
  • 【科普】贝叶斯神经网络与分形神经网络
  • 0731 IO进程基础
  • AscendantPath | 实现视觉小说的人物对话系统(二)
  • 逻辑回归算法基础介绍,简单的二分类三分类实例
  • 代码随想录刷题Day21
  • 面试题及解答:锁
  • 字母异位词分组(每天刷力扣hot100系列)
  • 即时通讯系统项目面试可能的考点
  • 对git 熟悉时,常用操作
  • QT收费情况
  • 谷歌V3插件热更新
  • 类与对象(上),咕咕咕
  • 【Node】nvm在windows系统无管理员权限切换node版本
  • 20250731在荣品的PRO-RK3566开发板的Android13下跑通敦泰的FT8206触控芯片
  • 【Java EE初阶 --- 网络原理】网络层---IP协议,数据链路层---以太网协议
  • OpenCV学习day2
  • YodA数据集的格式化(二)
  • MySQL 8.0 OCP 1Z0-908 题目解析(39)
  • 项目中如何追踪项目进度,避免项目延期如何追踪项目进度
  • 尚硅谷尚庭公寓学习笔记