原文链接: https://interview.poetries.top/docs/base/handwritten.html
手写篇
简版速记
面试前 5 分钟扫一遍,每条都是「一句话能说清的考点」。
- 防抖 debounce:连续触发只认最后一次。
clearTimeout+setTimeout,回调用func.apply(this, args)保留 this 和参数。场景:搜索联想、表单校验、按钮防重复提交。 - 节流 throttle:固定间隔执行一次。时间戳版「首次立即执行、末次丢失」;定时器版「首次延迟、末次补一次」。场景:scroll、resize、拖拽。
- instanceof:沿
__proto__链找构造函数.prototype,找到返回true,到null返回false。 - new:① 建空对象并把
__proto__指向构造函数prototype② 以该对象为 this 执行构造函数 ③ 构造函数返回对象则用它,否则用新对象。 - call/apply/bind:核心都是把函数挂到目标对象上调用以改变 this。
call传参列表、apply传数组、bind返回新函数(需兼容 new 调用时 this 指向实例)。 - 深拷贝:递归 +
WeakMap解决循环引用;要处理 Date、RegExp、Symbol、函数等特殊类型。结构化数据可直接用structuredClone(见下文补充)。 - Promise:三状态
pending/fulfilled/rejected,状态不可逆;then要支持链式、异步回调(用微任务/queueMicrotask)和返回值穿透;重点是resolvePromise处理 thenable。 - 手写 Ajax:
new XMLHttpRequest()→open→onreadystatechange(readyState===4 且 status 2xx) →send。现代等价物是fetch(见下文补充)。 - JSONP:靠
<script src>不受同源限制,仅支持 GET;需约定全局 callback 名。CORS 才是通用跨域方案。 - 发布订阅 vs 观察者:发布订阅有中间「事件中心」解耦发布者与订阅者;观察者是被观察者直接持有观察者列表并通知。
- async/await:本质是 Generator + 自动执行器(把
yield出的 Promise resolve 后再.next())。 - LRU:用
Map的插入有序性,get/set命中后先 delete 再 set 移到尾部,超容删keys().next().value(最老)。 - 柯里化:参数够了就执行,不够就返回继续收参的函数(
fn.length判断)。 - 手写继承:寄生组合式继承(
Object.create(父.prototype)修复原型链 + 修constructor)是 ES5 最优解;ES6 直接extends。
面试高频手写题
建议优先掌握:
instanceof- 考察对原型链的理解new- 对创建对象实例过程的理解call/apply/bind- 对this指向的理解- 手写
promise- 对异步的理解 - 手写原生
ajax- 对ajax原理和http请求方式的理解,重点是get和post请求的实现
目录
- 1 实现防抖函数(debounce)
- 2 实现节流函数(throttle)
- 3 实现instanceOf
- 4 实现new的过程
- 5 实现call方法
- 6 实现apply方法
- 7 实现bind方法
- 8 实现深拷贝
- 9 实现类的继承
- 10 实现Promise相关方法
- 11 实现发布订阅模式
- 12 实现观察者模式
- 13 实现单例模式
- 14 实现Ajax
- 15 实现JSONP方法
- 16 实现async/await
- 17 基于Generator函数实现async/await原理
- 18 实现ES6的const
- 19 实现一个迭代器生成函数
- 20 实现ES6的extends
- 21 实现Object.create
- 22 实现Object.freeze
- 23 实现Object.is
- 24 实现一个compose函数
- 25 setTimeout与setInterval实现
- 26 实现Node的require方法
- 27 实现LRU淘汰算法
- 28 框架相关
- 29 数组相关
- 30 正则相关
- 31 函数柯里化相关
- 32 字符串相关
- 33 实现工具函数
- 34 手写常见排序
- 35 算法数据结构
- 36 综合
