已解析题目
前端工程师相关题目
手写:并发池
这题考察 Promise 调度能力。核心是限制同时运行的任务数,保持结果顺序,明确失败策略,并在任务完成后持续补位。
CSS 动画,JS 动画和 Three.js 动画有什么区别?
这题考察动画方案选型。回答要比较 CSS、JS 和 Three.js 的表达能力、渲染路径、控制能力、性能成本和适用场景。
了解重排和重绘吗?
这题考察浏览器渲染链路和性能优化。回答要区分重排、重绘、合成,并说明常见触发条件、强制同步布局和优化手段。
INP 和 TTFB 是什么?
这题考察性能指标理解。INP 衡量交互响应延迟,TTFB 衡量首字节到达时间,回答要说明定义、影响因素、定位方法和优化方向。
如何收集性能数据?
这题考察前端性能监控体系。回答要区分实验室数据和真实用户数据,说明 Performance API、PerformanceObserver、业务上下文和可靠上报策略。
TailwindCSS 和 CSS 有什么区别?
这题考察 CSS 工程化理解。回答要说明 CSS 是原生语言,Tailwind 是 utility-first 框架,并比较组织方式、约束、构建和维护成本。
memo, useMemo, useCallback 分别是干什么的?
这题考察 React 记忆化优化边界。回答要区分组件跳过渲染、值缓存和函数引用稳定,并说明命中条件和成本。
什么场景下需要缓存?
这题考察缓存取舍。回答要说明什么值得缓存、缓存放在哪一层、key 和失效策略怎么设计,以及脏数据风险。
我把所有的组件都用 memo 包起来有什么问题?
这题考察 React 过度优化判断。回答要说明 memo 的比较成本、命中条件、引用稳定性、依赖复杂度和 Profiler 驱动优化。
Vite 和 Next.js 都用过,你会做 SSR 吗?
这题考察 SSR 全链路理解。回答要说明服务端渲染、数据获取、HTML 注水、客户端 hydration、构建产物和 Next.js 与 Vite 的职责差异。
用过 TS 吗,跟 JS 有什么区别?
这题考察 TypeScript 的类型系统边界和工程价值。高质量回答要讲清它是编译期约束、最终运行仍是 JavaScript,并补充外部数据、any 和运行时校验的边界。
手撕:数组拉平(flatten)
这题考察递归遍历、depth 语义、顺序保持和边界处理。回答时要先约定函数契约,再写出不会丢类型的实现,并说明深层数组时的栈风险。
webpack 打包原理
这题考察 Webpack 从入口构建依赖图、转换模块、生成 chunk 和注入运行时代码的完整链路。回答要区分模块、chunk、bundle、loader、plugin 和 runtime。
webpack 的 loader 和 plugin 的区别
这题考察 Webpack 扩展机制的职责边界。高质量回答要说明 loader 处理单个模块内容,plugin 参与构建生命周期,并能说清执行时机和典型场景。
webpack 热启动原理
这题考察 HMR 的端到端链路:文件监听、增量编译、WebSocket 通知、客户端拉取更新、模块 accept 和无法处理时回退刷新。
CSS position 属性说说,分别都是相对于谁
这题考察 position 各取值的文档流影响和 containing block 规则。回答要特别纠正 absolute 不一定相对父元素、fixed 也可能受特殊祖先影响。
CSS 单位说说
这题考察 CSS 单位的参照对象和适用场景。高质量回答要按绝对单位、字体相对单位、百分比、视口单位、容器相关单位和 Grid 单位分类。
CSS 水平垂直居中方案
这题考察居中方案的适用前提,而不是背一个固定写法。回答要按现代布局、定位方案、文本场景和未知尺寸边界分类。
filter、map、reduce 的性能和区别是什么?
这题考察数组高阶函数的语义、返回值、遍历成本和可读性取舍。先讲用途差异,再谈性能,避免把所有问题都归结为 reduce 更强。
虚拟 DOM 和 diff 算法
这题考察虚拟 DOM 的抽象目的、diff 的启发式假设、key 的节点身份作用和最终 patch 到真实 DOM 的过程。不要把虚拟 DOM 说成一定比直接操作 DOM 快。
数组常用的 API,哪些能改变原数组?
这题考察数组 API 的可变性和返回值语义。回答时按会修改原数组、返回新数组、只读取查询三类整理,并强调 sort、reverse、splice 是高频坑。
闭包是什么,闭包会导致什么?
这题考察词法作用域、变量保留、封装能力和内存风险。回答要说明闭包不是天然泄漏,只有无必要长期持有引用才会形成问题。
this 绑定说说
这题考察 this 的调用点规则、绑定优先级和箭头函数词法 this。回答要强调看调用方式,不是看函数声明位置。