前端面试必考7类手写代码实战解析

发布时间:2026/10/21 12:17:35

前端面试必考7类手写代码实战解析 1. 前端面试手写代码实战指南作为一名经历过京东等大厂面试的前端工程师我深知手写代码环节的重要性。这篇文章将详细解析京东等一线互联网公司前端面试中最常考的7类手写题包含完整实现、核心原理和电商场景应用。这些题目在我参与的面试中出现的频率高达90%掌握它们能显著提升面试通过率。2. 防抖与节流电商高频场景应用2.1 防抖(debounce)实现与原理防抖的核心思想是在事件频繁触发时只有当事件停止触发一段时间后才会执行处理函数。这在电商网站的搜索联想场景中尤为重要。/** * 防抖函数完整实现 * param {Function} fn - 需要防抖的函数 * param {number} delay - 延迟时间(毫秒) * param {boolean} immediate - 是否立即执行 */ function debounce(fn, delay 300, immediate false) { let timer null; return function(...args) { const context this; // 清除已有定时器保证唯一性 if (timer) clearTimeout(timer); if (immediate) { // 立即执行模式 const callNow !timer; // timer为null表示可以立即执行 timer setTimeout(() { timer null; // delay后重置timer }, delay); if (callNow) { fn.apply(context, args); } } else { // 非立即执行模式 timer setTimeout(() { fn.apply(context, args); }, delay); } }; }关键点说明闭包保存timer状态是防抖实现的核心apply确保函数执行时的this指向正确。2.2 京东实际应用场景搜索框联想用户输入时每按一个键都会触发搜索使用防抖可以避免频繁请求商品筛选条件变化价格区间滑动时实时筛选无限滚动加载滚动停止后再触发加载避免重复请求按钮防重复点击支付按钮等关键操作防止重复提交2.3 节流(throttle)的实现方案节流与防抖的区别在于节流保证在一定时间间隔内至少执行一次而防抖只在停止触发后执行一次。// 时间戳版首次立即执行 function throttle(fn, delay 300) { let lastTime 0; return function(...args) { const now Date.now(); if (now - lastTime delay) { fn.apply(this, args); lastTime now; } }; } // 定时器版最后一次也会执行 function throttleTimer(fn, delay 300) { let timer null; return function(...args) { const context this; if (!timer) { timer setTimeout(() { fn.apply(context, args); timer null; }, delay); } }; }3. 深拷贝的完整解决方案3.1 基础深拷贝实现深拷贝是前端面试必考题京东二面特别关注循环引用的处理。function deepClone(obj, map new WeakMap()) { // 处理基本类型和null if (typeof obj ! object || obj null) { return obj; } // 处理循环引用 if (map.has(obj)) { return map.get(obj); } // 初始化目标对象 let target Array.isArray(obj) ? [] : {}; map.set(obj, target); // 缓存已拷贝对象 // 处理Symbol属性 const symKeys Object.getOwnPropertySymbols(obj); if (symKeys.length) { symKeys.forEach(symKey { if (typeof obj[symKey] object obj[symKey] ! null) { target[symKey] deepClone(obj[symKey], map); } else { target[symKey] obj[symKey]; } }); } // 拷贝常规属性 for (let key in obj) { if (obj.hasOwnProperty(key)) { target[key] deepClone(obj[key], map); } } return target; }3.2 特殊类型处理完整的深拷贝还需要考虑以下特殊情况Date对象需要new Date(obj.getTime())RegExp对象需要new RegExp(obj.source, obj.flags)Function可以直接返回原函数还是需要克隆DOM元素通常直接返回原元素原型链是否需要保持原型关系4. Promise核心实现4.1 基础Promise实现class MyPromise { constructor(executor) { this.status pending; this.value undefined; this.reason undefined; this.onFulfilledCallbacks []; this.onRejectedCallbacks []; const resolve (value) { if (this.status ! pending) return; this.status fulfilled; this.value value; this.onFulfilledCallbacks.forEach(fn fn()); }; const reject (reason) { if (this.status ! pending) return; this.status rejected; this.reason reason; this.onRejectedCallbacks.forEach(fn fn()); }; try { executor(resolve, reject); } catch (err) { reject(err); } } then(onFulfilled, onRejected) { // 处理值穿透 onFulfilled typeof onFulfilled function ? onFulfilled : v v; onRejected typeof onRejected function ? onRejected : err { throw err }; const promise2 new MyPromise((resolve, reject) { if (this.status fulfilled) { setTimeout(() { try { const x onFulfilled(this.value); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); } else if (this.status rejected) { setTimeout(() { try { const x onRejected(this.reason); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); } else { this.onFulfilledCallbacks.push(() { setTimeout(() { try { const x onFulfilled(this.value); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); }); this.onRejectedCallbacks.push(() { setTimeout(() { try { const x onRejected(this.reason); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); }); } }); return promise2; } } function resolvePromise(promise2, x, resolve, reject) { // 避免循环引用 if (promise2 x) { return reject(new TypeError(Chaining cycle detected for promise)); } // 防止多次调用 let called false; if ((typeof x object x ! null) || typeof x function) { try { const then x.then; if (typeof then function) { then.call( x, y { if (called) return; called true; resolvePromise(promise2, y, resolve, reject); }, r { if (called) return; called true; reject(r); } ); } else { resolve(x); } } catch (e) { if (called) return; called true; reject(e); } } else { resolve(x); } }4.2 Promise扩展方法面试官可能会要求实现Promise.all、Promise.race等静态方法MyPromise.all function(promises) { return new MyPromise((resolve, reject) { const result []; let count 0; promises.forEach((p, i) { p.then( value { result[i] value; if (count promises.length) { resolve(result); } }, reason { reject(reason); } ); }); }); }; MyPromise.race function(promises) { return new MyPromise((resolve, reject) { promises.forEach(p { p.then(resolve, reject); }); }); };5. 函数柯里化与偏函数5.1 基础柯里化实现function curry(fn) { return function curried(...args) { if (args.length fn.length) { return fn.apply(this, args); } else { return function(...args2) { return curried.apply(this, args.concat(args2)); }; } }; } // 使用示例 function sum(a, b, c) { return a b c; } const curriedSum curry(sum); console.log(curriedSum(1)(2)(3)); // 6 console.log(curriedSum(1, 2)(3)); // 6 console.log(curriedSum(1)(2, 3)); // 65.2 京东实际应用场景参数复用电商中的折扣计算函数延迟执行表单验证规则组合动态生成函数根据用户权限生成不同的操作函数6. 前端性能监控实战6.1 核心性能指标FP (First Paint)首次绘制时间FCP (First Contentful Paint)首次内容绘制LCP (Largest Contentful Paint)最大内容绘制FID (First Input Delay)首次输入延迟CLS (Cumulative Layout Shift)累计布局偏移6.2 性能指标获取代码// 获取FP/FCP new PerformanceObserver((entryList) { const entries entryList.getEntries(); entries.forEach(entry { if (entry.name first-paint) { console.log(FP:, entry.startTime); } else if (entry.name first-contentful-paint) { console.log(FCP:, entry.startTime); } }); }).observe({ type: paint, buffered: true }); // 获取LCP new PerformanceObserver((entryList) { const entries entryList.getEntries(); const lastEntry entries[entries.length - 1]; console.log(LCP:, lastEntry.startTime); }).observe({ type: largest-contentful-paint, buffered: true }); // 获取CLS let clsValue 0; new PerformanceObserver((entryList) { const entries entryList.getEntries(); entries.forEach(entry { if (!entry.hadRecentInput) { clsValue entry.value; } }); console.log(CLS:, clsValue); }).observe({ type: layout-shift, buffered: true });6.3 京东性能优化实践LCP优化关键图片预加载使用WebP格式关键CSS内联非关键JS延迟加载CLS优化图片和视频设置固定宽高避免在现有内容上方插入动态内容使用transform动画代替影响布局的属性FID优化减少主线程长任务优化第三方脚本使用Web Worker处理复杂计算7. 电商业务常用工具函数7.1 数组去重高级实现// 支持对象去重 function unique(arr, key) { if (!key) { return [...new Set(arr)]; } const map new Map(); return arr.filter(item { const keyValue item[key]; if (!map.has(keyValue)) { map.set(keyValue, true); return true; } return false; }); } // 使用示例 const products [ { id: 1, name: iPhone }, { id: 2, name: iPad }, { id: 1, name: iPhone 13 } ]; console.log(unique(products, id)); // 输出: [{id:1,name:iPhone}, {id:2,name:iPad}]7.2 金额格式化增强版function formatMoney(cent, options {}) { const { prefix ¥, decimal 2, thousand ,, isNegativeRed true } options; let amount cent / 100; const isNegative amount 0; amount Math.abs(amount); let [integer, fraction] amount.toFixed(decimal).split(.); integer integer.replace(/\B(?(\d{3})(?!\d))/g, thousand); let result ${prefix}${integer}; if (decimal 0) { result .${fraction}; } if (isNegative) { result -${result}; if (isNegativeRed) { result span stylecolor:red${result}/span; } } return result; } // 使用示例 console.log(formatMoney(123456)); // ¥1,234.56 console.log(formatMoney(-123456, { isNegativeRed: false })); // -¥1,234.567.3 手机号/邮箱脱敏工具function maskInfo(str, type phone) { const patterns { phone: { regex: /(\d{3})\d{4}(\d{4})/, replacement: $1****$2 }, email: { regex: /(\w{1,3})[\w.-]*([\w-]\.)[\w-]{2,4}/, replacement: $1***$2 }, idCard: { regex: /(\d{4})\d{10}(\w{4})/, replacement: $1**********$2 } }; const { regex, replacement } patterns[type] || patterns.phone; return str.replace(regex, replacement); } // 使用示例 console.log(maskInfo(13812345678)); // 138****5678 console.log(maskInfo(testexample.com, email)); // tes***example.com8. 面试准备建议手写代码练习每天至少手写3个核心函数注意边界条件性能优化理解每个性能指标背后的优化原理能举例说明电商场景熟悉常见业务逻辑的实现方式代码规范注意变量命名、代码格式和注释调试能力能解释每行代码的作用和可能的问题在实际面试中面试官不仅关注代码能否运行更关注实现思路、边界条件处理和性能考虑。建议在实现完基础功能后主动讨论可能的优化空间和替代方案。
延伸阅读

更多相关文章

2026/10/22 0:23:46

GFS-VL:融合3D VLM稠密知识与少样本校准的点云分割新思路

CVPR 2025 的三维点云分割工作不少,但把 3D VLM 的稠密知识引入少样本分割,并专门做校准的框架,GFS-VL 是比较值得关注的一个。它的目标很明确:在每一类只有少量标注样本的情况下,让模型仍然能对点云做高质量分割。这个…

2026/10/19 13:28:18

锁相放大器原理详解:从相敏检测到数字解调实现

第一次接触锁相放大器(Lock-in Amplifier)是在做光电检测实验的时候。当时要测一个被强背景光完全淹没的微弱反射信号,示波器上能看到的就是一片随机抖动的噪声,普通万用表接上去读数根本没有意义。导师把一台锁相放大器放到桌上&…

2026/10/20 9:08:03

2026-08-25 GitHub 热点项目精选

/* 全局样式 */* { margin: 0; padding: 0; box-sizing: border-box; }body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;max-width: 900px; margin: 0 auto; padding: 30px 20px; line-height: 1.7; color: #2d3748;backgro…

2026/10/22 3:57:35

微服务架构演进指南:从单体到云原生核心路径

“微服务架构演进”这个话题,我在技术圈聊了快十年。早期大家追着这个概念跑,觉得拆了服务就高级了,后来发现拆分之后一堆分布式问题比单体时代更难处理。再往后,容器、编排、服务网格这些能力成熟了,大家才慢慢意识到…

2026/10/22 3:57:35

多模态图学习新范式:对齐、生成与推理的论文创新与实战

前阵子身边好几个做研究的朋友都在聊同一个现象:多模态图学习方向的论文,中稿率突然变得异常友好,而且还不乏一区TOP。有人连续两篇都落在同一档次的期刊上,选题看着也没有特别"炫技",无非是"图文本&qu…

2026/10/22 3:57:35

实测Gemini 3 Pro:AI辅助论文写作全流程工作流与提示词模板

凌晨三点,实验室的灯还亮着,电脑屏幕上是一篇改了七遍的引言,光标在第四段末尾闪烁。这种场景我想每个科研人都再熟悉不过——不是写不出来,是总觉得哪里不对劲,又说不上来哪里不对劲。后来我花了很长一段时间研究所谓…

2026/10/22 3:57:35

用Portorch实现线性回归:从零掌握深度学习框架训练全流程

要说线性回归这类基础模型,很多人第一反应是“这么简单的东西还需要专门用深度学习框架写一遍吗”?但如果把维度换一下,线性回归恰恰是理解深度学习框架工作流的最佳载体,没有之一。你把一个线性回归跑通了,后面所有复…

2026/10/22 3:57:35

多层RNN实战指南:从堆叠原理到训练调参全解析

我前两天在复盘一个序列预测项目,发现不少同事一听说“把RNN堆成多层”就头疼,觉得训练难度大、效果还不可控。其实多层循环神经网络(Multi-layer RNNs)并没有想象中那么神秘。它的核心逻辑不复杂:让每一层网络站在上一…

2026/10/22 3:52:34

AI海马体困境:构建真正可信赖的长期记忆系统

1. 项目概述:当AI助手开始“失忆”,问题不在算力,而在结构你有没有过这种体验:刚让AI助手记下会议要点,转头问它“刚才说的第三条是什么”,它一脸茫然;或者连续聊了二十分钟项目细节&#xff0c…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/22 0:01:49

电商智能运营体系从0到1:架构设计、落地步骤与避坑指南

前两年我们团队接了一个电商平台的运营中台项目,目标很直白:把过去靠运营拍脑袋做的选品、定价、发券、推活动这些事,逐步用数据算法和自动化流程代替。项目名字内部就叫“电商智能运营体系”。最近有不少朋友问我当时是怎么设计的、踩过哪些…

2026/10/22 0:01:49

若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定

最近一段时间,我一直想把后台管理系统里那些机械重复的增删改查代码交给AI去写。框架用的是若依,按理说这类业务代码模式非常固定,应该是AI最擅长的事情。可真试下来却不是那么回事——你让AI生成一个用户管理模块,它给出的Contro…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑