手写和输出题:按这个顺序练
把相关知识和复习方法放在一起,随时回看。
以下所有手写题的回答要点、完整代码、示例、复杂度与边界说明已放在 手写题参考答案。代码以明确支持范围的面试实现为目标,不冒充完整原生规范实现。
| 优先级 | 题型 | 重点边界 |
|---|---|---|
| P0 | 防抖、节流 | this、参数、连续调用、取消、首尾触发 |
| P0 | Promise / async 输出题 | 执行器同步、微任务、await、异常传播 |
| P0 | 数组去重、分组、扁平化 | 相等规则、输入不修改、空数组、嵌套深度 |
| P0 | 列表转树 / 树遍历 | 根节点、孤儿节点、重复 ID、环、复杂度 |
| P0 | 简化 Promise.all | 空输入、普通值、拒绝、结果顺序、同步异常 |
| P0 | 并发限制调度器 | 真正限制任务启动、结果顺序、失败策略、补位 |
| P0 | 基础算法 | Map / Set、双指针、栈、二分、树的 DFS / BFS |
| P1 | 深拷贝 | 支持范围、循环引用、共享引用、特殊对象 |
| P1 | 发布订阅 | 取消监听、once、触发期间增删、回调异常策略 |
| P1 | 简化 call / bind / new | this、返回值、构造调用;说明简化实现的边界 |
| P1 | 带过期时间的缓存 / LRU | 过期、容量、刷新访问顺序、边界参数 |
| P2 | 简化响应式 / Promise | 原理演示与规范完整实现要区分 |
事件循环自测:
console.log('A')
setTimeout(() => console.log('B'), 0)
Promise.resolve().then(() => {
console.log('C')
Promise.resolve().then(() => console.log('D'))
})
async function run() {
console.log('E')
await Promise.resolve()
console.log('F')
}
run()
console.log('G')
答案:A E G C F D B。同步部分先结束;C 和 await 的继续执行 F 按入队顺序处理,C 执行时追加 D;本例中的定时器回调最后执行。要会解释队列过程,不能只记顺序。