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

相关推荐
晚霞的不甘7 分钟前
Flutter for OpenHarmony手势涂鸦画板开发详解
前端·学习·flutter·前端框架·交互
Beginner x_u9 分钟前
JavaScript 核心知识索引(面试向)
开发语言·javascript·面试·八股
We་ct11 分钟前
LeetCode 73. 矩阵置零:原地算法实现与优化解析
前端·算法·leetcode·矩阵·typescript
晚霞的不甘12 分钟前
Flutter for OpenHarmony 实现动态天气与空气质量仪表盘:从 UI 到动画的完整解析
前端·flutter·ui·前端框架·交互
~小仙女~15 分钟前
组件的二次封装
前端·javascript·vue.js
白日梦想家68116 分钟前
JavaScript性能优化实战系列(三篇完整版)
开发语言·javascript·性能优化
这是个栗子20 分钟前
AI辅助编程(一) - ChatGPT
前端·vue.js·人工智能·chatgpt
2501_9444480021 分钟前
Flutter for OpenHarmony衣橱管家App实战:预算管理实现
前端·javascript·flutter
Remember_99324 分钟前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
2501_9444480025 分钟前
Flutter for OpenHarmony衣橱管家App实战:意见反馈功能实现
android·javascript·flutter