手写题高频清单:防抖节流、深拷贝、call/apply/bind、new、Promise 系列(all、race、重试)、发布订阅、数组扁平化、去重与排序、instanceof 等。答题套路是先确认输入输出与边界条件,写主流程,再补异常处理与测试用例,最后主动分析时间复杂度。
防抖与节流必须秒写:防抖是触发后延迟执行、期间再触发则重新计时;节流是固定时间间隔内最多执行一次。深拷贝要处理循环引用与特殊类型。写的时候注意变量命名清晰、边界判断完整,代码风格有时候比答案本身更影响面试官印象。
// 手写 call:把函数临时挂到传入对象上执行 Function.prototype.myCall = function (ctx, ...args) { ctx = ctx == null ? globalThis : Object(ctx); const key = Symbol('fn'); ctx[key] = this; const ret = ctx[key](...args); delete ctx[key]; return ret; }; // 手写 bind:闭包保存 this 与参数 Function.prototype.myBind = function (ctx, ...args) { const fn = this; return function (...rest) { return fn.apply(ctx, [...args, ...rest]); }; }; function greet(g, name) { return g + ' ' + name + ' from ' + this.place; } const host = { place: 'Beijing' }; console.log(greet.myCall(host, 'Hello', 'Lily')); // Hello Lily from Beijing console.log(greet.myBind(host, 'Hi')('Lucy')); // Hi Lucy from Beijing