原文链接: 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。
  • 手写 Ajaxnew XMLHttpRequest()openonreadystatechange(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请求方式的理解,重点是getpost请求的实现

目录

Last Updated:
Contributors: leeguooooo