JavaScript
你以为是 A,实际是 B
。typeof 的三个谎言、闭包捕获的是变量、微任务顺序、深拷贝的五个坑。
从语言基础与样式布局,到框架与跨端、服务端与网关,再到工程化与质量、架构与编码,最后是浏览器扩展。 每一份都是同一种写法:先给一段能跑的例子,再解释为什么会这样,最后给一条面试可以直接说出口的答法。 它们不是用来读一遍的,是用来遮住结论、自己先推一遍的。
你以为是 A,实际是 B
。typeof 的三个谎言、闭包捕获的是变量、微任务顺序、深拷贝的五个坑。
类型不是注释
。结构化类型、条件类型与 infer、类型擦除为什么让 Nest 必须用 token。
两个盒子模型,决定了整页的尺寸
。box-sizing 改的是 width 指向哪一层、BFC 到底隔离了什么、层叠上下文谁盖谁。
一次请求要穿过多少层
。缓存、CORS 到底限制什么、渲染五步、XSS 与 CSRF 的分工。
先看清它的限制
。故意写成"哪里会出问题":四个监听盲区、数组七个方法、双端比较什么时候多挪 DOM。
每一项改动,都是在还债
。Proxy 补四个洞、PatchFlag 把"比什么"编译进去、LIS 少挪 DOM。
别背结论,把它推一遍
。state 是快照、批处理、闭包陷阱、Fiber 为什么能打断自己。
刷新 404 的时候,前端根本不知道
。hash 与 history 差在哪、守卫的完整顺序、权限做过滤还是动态注册。
状态放在哪,比用什么库更重要
。Pinia 凭什么砍掉 mutations、Redux 为什么要求纯函数、订阅粒度决定谁重渲染。
不是小号的网页
。双线程与 setData 的成本、分包、登录为什么换不到 openid、uni-app 与 Taro 的编译路线。
单线程,但不阻塞
。事件循环六个阶段、nextTick 的插队、Stream 背压,以及手写一个最小 SSR。
它把 Express 的自由换成了约定
。DI 凭什么知道你缺什么、请求生命周期那条链、作用域为什么会污染整条链。
网关的坑都在细节里
。location 优先级、proxy_pass 的斜杠、add_header 的继承陷阱、502 与 504 怎么分。
不写心跳,就会"假在线"
。四代方案各发多少请求、握手怎么升级、断了怎么重连、多机怎么广播。
题都出在语义边界上
。== 和 equals 差在哪、循环拼接为什么是平方级、HashMap 何时树化、for-each 里删元素为什么会静默跳过数据。
所有问题都指向一件事
。调用有没有经过代理:事务失效、AOP 失效、循环依赖、Bean 生命周期,全是这一条的推论。
慢的 SQL 都慢在同一个地方
。索引没走对,或者锁等太久。key_len、rows、Extra 三列就能定位九成慢查询,剩下一成藏在 MVCC 和间隙锁里。
并发的事故都是「以为锁住了」
。锁错了对象、volatile 当原子用、队列无界把堆撑爆、ThreadLocal 忘 remove 导致串号。每节都给一段会真出问题的代码。
最后都落到日志里那句话
。OOM 冒号后面那句、jstack 里那个十六进制线程号——两条线索解决八成线上问题。空对象 16 字节、栈深两万多,都是真跑出来的。
缓存的问题从来不在缓存本身
。它挂了怎么办、和库对不上怎么办、一个慢命令把整个实例卡死怎么办。穿透击穿雪崩是三种病,解法完全不同。
打包器其实只做三件事
。loader 与 plugin 的分界、Vite 为什么快、contenthash 与长缓存。
别人凭什么敢用你的包
。exports 为什么 types 要写最前、peerDependencies 解决什么、双包陷阱。
先量,再改
。LCP / INP / CLS、长任务与时间切片、布局抖动,每条手段都先讲机制。
覆盖率 100% 的代码照样全是 bug
。金字塔为什么这么分、什么时候该 mock、覆盖率怎么读才不被骗。
reset 和 revert 差的是别人的仓库
。三个区域怎么流转、merge 与 rebase 怎么选、reflog 怎么救回误删的提交。
会排查的人先缩范围
。白屏、变慢、内存涨、CPU 高,每种症状一条最短的定位路径,以及先止血还是先定位。
0 到 1 的难点是判断
。不可逆决策怎么排、目录按什么分、请求层怎么封、Node 怎么分层、什么时候该拆。
它解决的不是技术问题,是组织问题
。沙箱三种实现、样式隔离四代、谁管 URL、什么情况下不该上。
先问清约束,再谈方案
。大文件分片怎么失败重传、断点续传与秒传、扫码登录的两种实现。
写出答案只是及格线
。双指针、滑窗、链表、DP、回溯与 TopK,每类题该说什么、该写什么。
考的是细节不是记忆
。防抖、深拷贝的循环引用、Promise 三要素、bind 的 new 语义、并发池。
三个世界,一套消息
。Service Worker 30 秒休眠、content script 为什么拿不到页面变量、MV3 的权限与审核。
三十二份材料看着是二十九个话题,其实有几根线把它们串在一起。面试里真正拉开差距的, 往往不是某个 API 的细节,而是你能不能在这些线上讲出"为什么不同"。
defineProperty 在属性被赋值的那一刻就知道变了,Dep 精确通知对应的 Watcher,再走双端比较。发现得最早,但只对已有 key 有效。exports 决定用户能拿到哪份产物、sideEffects 决定它能不能被摇掉。包的设计直接决定了别人打包时有多少优化空间。renderToString 出一段字符串,客户端 hydrateRoot 接管。手写一遍才知道坑在哪:数据必须序列化塞回页面,而且 < 不转义就是一个 SSR 独有的 XSS 口子。@Render 加模板引擎(服务端拼 HTML,没有 hydration),或者只提供 API,把 SSR 交给 Next / Nuxt。结论是后者。/user/42,服务器必须回退到 index.html;hash 模式天然不会 404,因为 # 后面的东西根本没发给服务器。502 还是 504:连不上就是进程没了,连上了但没回就是它慢了。一步分叉,省掉一半排查时间。Ctrl/Cmd + P 直接出 PDF。