跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
|注册
博客列表

目录

  1. 一、字节跳动(抖音电商团队)
  2. 一面(基础与深度,约 60 分钟)
  3. 二面(项目与性能,约 70 分钟)
  4. 三面(主管面,约 45 分钟)
  5. 二、淘天集团(阿里,大淘宝技术)
  6. 一面(技术广度,约 50 分钟)
  7. 二面(架构与基建,约 60 分钟)
  8. 三、美团(到店事业群)
  9. 一面(JS 核心,约 50 分钟)
  10. 二面(场景与安全,约 60 分钟)
  11. 四、高频手写题复盘
  12. 1. 带并发限制的异步调度器(字节高频)
  13. 2. 完美的深拷贝(阿里高频)
  14. 3. 一维数组转树形结构(美团高频)
JavaScriptNode.jsAI大前端算法

三年前端面试复盘:字节阿里美团高频题与手写源码解析

复盘了三年经验前端工程师在字节跳动、淘天集团及美团的面试经历。内容涵盖计算机基础、框架底层原理、网络协议、工程化基建及性能优化等核心考点。重点整理了三道高频手写代码题:带并发限制的异步调度器、支持循环引用的深拷贝、一维数组转树形结构。同时提供了简历优化、技术栈拓展及 AI 工具使用等求职建议,旨在帮助求职者提升差异化竞争力。

筑梦师发布于 2026/4/6更新于 2026/4/121 浏览
三年前端面试复盘:字节阿里美团高频题与手写源码解析

本文基于三年前端经验,复盘了字节跳动、淘天集团及美团的面试过程与高频考点。重点涵盖底层原理、工程化基建、性能优化及复杂场景解决能力。

一、字节跳动(抖音电商团队)

面试特点: 极其看重计算机基础、算法能力和源码理解。基本每一轮都会有一到两道 Hard/Medium 级别的算法题或手写题。

一面(基础与深度,约 60 分钟)

一面面试官主要考察基础的扎实程度,问得很细。

  1. CSS/HTML: BFC 的触发条件和应用场景?如何实现一个高度自适应的瀑布流布局?
  2. JS 基础: V8 引擎的垃圾回收机制(新生代/老生代)?WeakMap 和 Map 的区别,WeakMap 解决了什么内存泄漏问题?
  3. 框架底层: React 19 的 Compiler 机制解决了什么问题?对比 Vue 3.5 的响应式优化(基于 Proxy 的深度解析)。
  4. 网络: HTTP/2 的多路复用原理?HTTP/3 为什么采用 UDP(QUIC 协议)?
  5. 手写题: 实现一个带并发限制的 Promise.all。
二面(项目与性能,约 70 分钟)

二面压力剧增,面试官会顺着你的项目往深处挖。

  1. 项目难点: 你在项目中如何处理十万级数据的表格渲染?(答了虚拟列表,紧接着被追问:如果列表项高度是不固定的怎么算位置?)
  2. 性能优化: 首屏加载优化做了哪些?除了常规的路由懒加载、CDN,有了解过 prefetch/preload 的底层优先级吗?
  3. 工程化: 你们项目从 Webpack 迁移到 Vite/Rspack 的过程中遇到了什么坑?CommonJS 和 ES Module 在构建时的 Tree-Shaking 差异在哪?
  4. 算法题: LeetCode 146. LRU 缓存机制(要求 O(1) 时间复杂度,使用 Map 和双向链表实现)。
三面(主管面,约 45 分钟)

主管面主要考察业务思考、抗压能力和对前沿技术的敏感度。

  1. 你觉得过去三年里,你主导的最成功的一个技术方案是什么?业务收益如何量化?
  2. 平时怎么学习前端新技术的?
  3. 前沿探索: 目前 AI 编码助手(如 Cursor、Copilot)很火,你是如何利用 AI 提升日常开发效率的?前端未来会被 AI 取代吗?

二、淘天集团(阿里,大淘宝技术)

面试特点: 偏向前端工程化、复杂架构设计(微前端/Monorepo)以及对业务指标的理解。

一面(技术广度,约 50 分钟)
  1. 微前端: 了解过 Qiankun 和 Wujie(无界)吗?谈谈基于 Web Components 的样式隔离和基于 Proxy 的 JS 沙箱原理。
  2. 状态管理: Redux Toolkit 和 Zustand 的核心差异?为什么现在更推荐 Zustand 这种轻量级方案?
  3. Node.js: SSR(服务端渲染)的原理是什么?Next.js/Nuxt.js 中如何处理客户端和服务端状态注水(Hydration)不一致的报错?
  4. 手写题: 手写深拷贝(Deep Clone),要求解决循环引用和 Map/Set 类型问题。
二面(架构与基建,约 60 分钟)
  1. Monorepo 架构: 为什么要用 pnpm workspace 做 Monorepo?pnpm 的幽灵依赖是怎么解决的(软硬链接原理)?
  2. 前端监控: 如何设计一个前端监控 SDK?错误收集(window.onerror vs unhandledrejection)、白屏检测机制怎么做?
  3. CI/CD: 讲一下你们公司的前端自动化部署流水线(GitLab CI / GitHub Actions 编写)。
  4. 手写题: 数组扁平化(Flat)及其逆运算(将一维数组转成树形结构)。

三、美团(到店事业群)

面试特点: 极其注重原生 JS 功底,有很多场景题,喜欢问跨端(小程序/H5)。

一面(JS 核心,约 50 分钟)
  1. 事件循环(Event Loop): 宏任务和微任务的执行顺序?Node.js 环境下的 Event Loop 和浏览器有什么区别?
  2. 闭包: 给了一段经典的闭包输出题(带 setTimeout 和 var/let),让说出输出结果及原理。
  3. 跨端通信: H5 嵌入在美团 App 内,JSBridge 的底层通信原理是什么?(URL Schema 拦截 / 注入全局对象)。
  4. 手写题: 防抖(Debounce)和节流(Throttle),要求防抖支持'立即执行一次'的参数。
二面(场景与安全,约 60 分钟)
  1. 安全防护: 详细讲讲 XSS 和 CSRF 攻击的原理及防御手段。Cookie 的 SameSite 属性有哪几个值,分别代表什么?
  2. 场景题: 如果用户网络极差,上传大文件(如 1GB 视频)经常中断,前端怎么设计一个'断点续传 + 秒传'的方案?(切片上传 + Web Worker 计算 File MD5)。
  3. 算法题: 版本号对比(如比较 1.0.1 和 1.0.01.1 的大小)。

四、高频手写题复盘

面试前,这几段代码请务必在白纸上能默写出来!

1. 带并发限制的异步调度器(字节高频)

题目描述: 实现一个 Scheduler,支持并发执行异步任务,但最大并发数受限。

class Scheduler {
  constructor(limit) {
    this.limit = limit; // 最大并发数
    this.count = 0; // 当前正在运行的任务数
    this.queue = []; // 等待队列
  }

  add(task) {
    return new Promise((resolve) => {
      task.resolve = resolve;
      if (this.count < this.limit) {
        this.run(task);
      } else {
        this.queue.push(task);
      }
    });
  }

  run(task) {
    this.count++;
    task().then((res) => {
      task.resolve(res);
      this.count--;
      // 执行完一个,如果队列有任务,继续执行
      if (this.queue.length > 0) {
        this.run(this.queue.shift());
      }
    });
  }
}


 scheduler =  ();
  = () =>  ( (r, time));
  = () => {
  scheduler.( (time)).( .(order));
};
(, );
(, );
(, );
(, );

2. 完美的深拷贝(阿里高频)

题目描述: 实现深拷贝,需处理数组、对象、Map、Set 以及循环引用。

function deepClone(obj, hash = new WeakMap()) {
  // 处理 null 或非对象
  if (obj === null || typeof obj !== 'object') return obj;
  // 处理 Date 和 RegExp
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
  // 处理循环引用,如果 hash 中有,直接返回
  if (hash.has(obj)) return hash.get(obj);
  // 处理 Map
  if (obj instanceof Map) {
    const map = new Map();
    hash.set(obj, map);
    obj.forEach((val, key) => {
      map.set(key, deepClone(val, hash));
    });
    return map;
  }
  // 处理 Set
  if (obj instanceof Set) {
    const set = new Set();
    hash.set(obj, set);
    obj.forEach(val => {
      set.((val, hash));
    });
     set;
  }
  
   cloneObj =  obj.();
  hash.(obj, cloneObj);
  
  .(obj).( {
    cloneObj[key] = (obj[key], hash);
  });
   cloneObj;
}
3. 一维数组转树形结构(美团高频)

题目描述: 将带有 id 和 parentId 的扁平化数组,转换为树形结构。

const list = [
  { id: 1, name: '部门 A', parentId: 0 },
  { id: 2, name: '部门 B', parentId: 0 },
  { id: 3, name: '部门 C', parentId: 1 },
  { id: 4, name: '部门 D', parentId: 1 },
  { id: 5, name: '部门 E', parentId: 2 },
];

function listToTree(data) {
  const map = {};
  const tree = [];
  // 先把数据映射进 map
  data.forEach(item => {
    map[item.id] = { ...item, children: [] };
  });
  // 再遍历一遍,寻找父节点
  data.forEach(item => {
    if (item.parentId === 0) {
      // 根节点
      tree.push(map[item.id]);
    } else {
      // 找到父节点,塞进 children
      if (map[item.parentId]) {
        map[item.]..(map[item.]);
      }
    }
  });
   tree;
}
.(.((list), , ));

对于三年经验的前端来说,'差异化竞争'是关键:

  1. 简历拒绝流水账: 不要只写'使用 Vue 开发了后台系统'。要写出收益:'通过引入 Vite 预构建与动态按需加载,将项目冷启动时间从 30s 缩短至 5s,FCP 提升 40%'。
  2. 打破舒适区: 2026 年了,别局限在切图和调接口上。花点时间看看 Node.js、学习一下 Rust 构建工具链(Rspack / SWC)、了解 CI/CD,往全栈或工程化前端靠拢。
  3. 拥抱 AI: 面试中一定要表现出你在积极使用 AI 工具(Cursor、GitHub Copilot)辅助编程,大厂现在极其看重开发者的'AI 智商'(提效能力)。
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • OpenClaw 结合 Qwen3.5 实现本地 AI 助手部署指南
  • LangChain 核心组件 RunnableLambda 详解与实战
  • B 站视频 AI 总结功能教程:如何快速提取核心内容
  • OpenClaw Webhook 详解与配置指南
  • Web 自动化测试入门:从概念到百度搜索实战
  • 2026 年十大 AI 编程工具推荐
  • 2026 年 3 月全球 AI 前沿动态
  • MacOS 下基于 Docker 部署 OpenClaw 并集成飞书机器人
  • 基于 AI 代码助手的垃圾图片识别系统构建实践
  • Vibe Coding 实践指南:用 AI 从想法到应用
  • AI 学习路线规划
  • 前端错误监控与处理实战指南
  • OpenClaw 浏览器控制:Chrome Debug 模式配置指南
  • Unity+AI 一句话制作完整小游戏实战指南
  • Unity 接入 DeepSeek 实现 AI 对话完整步骤
  • 基于 SpringBoot+Vue 的网上摄影工作室系统设计与实现
  • 前端精确数字运算解决方案:使用 BigNumber.js 处理 JavaScript 精度问题
  • 【测试理论与实践】(十)Web 项目自动化测试实战:从 0 到 1 搭建博客系统 UI 自动化框架
  • 汽车雷达在多径存在下的幽灵目标检测——论文阅读
  • 【前端】javaScript

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

// 测试代码
const
new
Scheduler
2
const
timeout
time
new
Promise
r =>
setTimeout
const
addTask
time, order
add
() =>
timeout
then
() =>
console
log
addTask
1000
'1'
addTask
500
'2'
addTask
300
'3'
addTask
400
'4'
// 输出顺序:2, 3, 1, 4
add
deepClone
return
// 处理数组和普通对象
const
new
constructor
set
// 使用 Reflect.ownKeys 获取所有键,包括 Symbol
Reflect
ownKeys
forEach
key =>
deepClone
return
parentId
children
push
id
return
console
log
JSON
stringify
listToTree
null
2