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 / 栈

相关推荐
GinoWi17 分钟前
HTML基本格式 - 第一个HTML网页
前端
顶鲜花的牛粪21 分钟前
Astro 项目升级全栈:EdgeOne Pages 部署指南
前端
0***R51532 分钟前
前端云原生
前端·云原生
月弦笙音41 分钟前
【Promise.withResolvers】发现这个api还挺有用
前端·javascript·typescript
疯狂踩坑人43 分钟前
MCP理论和实战,然后做个MCP脚手架吧
前端·node.js·mcp
中杯可乐多加冰1 小时前
基于 DeepSeek + MateChat 的证券智能投顾技术实践:打造金融领域的专属大Q模型助手
前端·人工智能
凡人程序员1 小时前
搭建简易版monorepo + turborepo
前端·javascript
丸子哥哥1 小时前
同一个域名,如何添加多个网站?
服务器·前端·nginx·微服务
不努力也不会混1 小时前
vite联邦实现微前端(vite-plugin-federation)
前端·vue.js
伍亿伍千万1 小时前
Uptime Kuma修改作为内嵌页面的自适应
前端