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

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


✅ 一、防抖(Debounce)

📌 场景:

  • 例如搜索输入框,每次输入触发搜索太频繁;
  • 希望用户停止操作后一段时间再触发函数

✅ 实现方式:

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

✅ 使用方式:

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

✅ 二、节流(Throttle)

📌 场景:

  • 例如滚动监听、按钮点击,频繁触发但希望控制执行频率
  • 比如希望每 500ms 执行一次即可。

✅ 时间戳实现:

ini 复制代码
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);
    }
  };
}

✅ 使用方式:

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

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

📌 场景:

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

✅ 方法 1:递归实现

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

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

ini 复制代码
const arr = [1, [2, [3, [4]]]];
const result = arr.flat(Infinity);

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

arduino 复制代码
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 / 栈

相关推荐
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫1 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
小鹏linux2 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
前端若水3 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger3 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)3 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态4 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态4 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart4 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe54 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架