前端面试手撕题目全解析

以下是前端面试中常遭遇的“手撕”基础题目汇总,涵盖 HTML→JS→Vue→React,每题附经典实现/原理解析,可现场答题或后端总结。


HTML 基础题 📝

  1. 语义化卡片(Semantic Card + ARIA)

    <article class="card" aria-label="Product Card"><header><h2 class="card-title">超轻量可折叠水杯</h2></header><section class="card-body"><p class="description">不占空间,随时随地喝水</p><button aria-label="Add to cart">🛒</button></section>
    </article>
    

    ✅ 掌握 <main>, <article>, <section>, <header> 等 HTML5 语义标签;为无障碍辅助技术提供兼容(通过 aria-label);

  2. Sticky Footer 实现(Flex 布局 + min-height: 100vh

    <body class="page"><main class="content">…多内容…</main><footer class="footer">© 2025 Demo 公司</footer>
    </body>
    
    html, body { margin:0; padding:0; }
    .page { min-height:100vh; display:flex; flex-direction:column; }
    .content { flex:1; }
    .footer { height:60px; background:#f3f3f3; }
    
  3. 自定义元素 + Native Form 验证示例

    <label for="age">年龄<label><input id="age" type="number" min="1" max="120" required>
    <button onclick="form.reportValidity()">提交</button>
    

    ✅ 演示如何结合自定义 typerequired 以及 reportValidity() 显示原生错误提示。


JavaScript 常考题 💡

手写防抖 & 节流

function debounce(fn, ms = 300) {let timer;return function(...args) {clearTimeout(timer);timer = setTimeout(() => fn.apply(this, args), ms);};
}function throttle(fn, ms = 300) {let last = 0, timer = null;return function(...args) {const now = Date.now();if (now - last < ms) {clearTimeout(timer);timer = setTimeout(() => {last = Date.now();fn.apply(this, args);}, ms - (now - last));} else {last = now;fn.apply(this, args);}};
}

✅ 面试时经典考察滚动、输入频率控制函数,应理解 clearTimeout 的作用与首次触发/尾触发的区别。文中提到防抖 vs 节流面试解析非常常见 (掘金)。


Promise.all() 简易版

Promise.myAll = function(iterable) {return new Promise((resolve, reject) => {const arr = Array.from(iterable);if (arr.length === 0) return resolve([]);const res = new Array(arr.length);let count = 0;arr.forEach((p, i) => {Promise.resolve(p).then(val => {res[i] = val;count += 1;if (count === arr.length) resolve(res);}).catch(reject);});});
};

✅ 面试中对实现并发控制、失败短路、位置保持非常常见 (大厂面试每日一题, 思否)。


深拷贝(DeepClone)示例

function deepClone(obj, map = new WeakMap()) {if (obj === null || typeof obj !== 'object') return obj;if (map.has(obj)) return map.get(obj);const clone = obj instanceof Date ? new Date(obj): obj instanceof RegExp ? new RegExp(obj): Array.isArray(obj) ? []: {};map.set(obj, clone);Reflect.ownKeys(obj).forEach(key => {clone[key] = deepClone(obj[key], map);});return clone;
}

✅ 要处理循环引用、特殊对象、保持原型链与不可枚举属性等深度拷贝复杂性 (ExplainThis)。


事件循环 + 宏任务/微任务机制解析(经典题)

题目示例:

console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
console.log('D');

输出结果: A D C B

解析: 浏览器事件循环会先执行同步代码(A, D),然后将 .then 放入微任务队列(优先级高),立即执行(C),最后执行宏任务队列中的 setTimeout 回调(B) (CSDN博客)。

✅ 面试常見用以检测对 JS 单线程、事件循环模型与 async/await背后原理的掌握。


Vue 基础题目 🧪

  1. 生命周期顺序与场景适用:

    beforeCreate → created → beforeMount → mounted → beforeUpdate → updated → beforeUnmount/ destroyed
    

    ✔ 可用于初始化数据、手动注册订阅、第三方插件挂载、子组件交互等场景 (ExplainThis)。

  2. 手写简化 v-model 指令支持 <input> 双向绑定:

    app.directive('model', {beforeMount(el, binding, vnode) {el.value = binding.value;el.addEventListener('input', e => {vnode.context[binding.expression] = e.target.value;});},updated(el, binding) {if (el.value !== binding.value) el.value = binding.value;}
    });
    

    ✔ 考察 listener + props sync,理解 update hook 中避免老值 stale problem。

  3. Vue 的响应式原理(简版伪代码):

    • 使用 Object.defineProperty 拦截 getter/setter,收集依赖;
    • 每个组件对应一个 Watcher,监听属性变化后发起重新渲染;
    • Dep.notify() 通知所有 watcher 更新视图;
    • Vue 的更新机制是“push + diff”(比 React 更精细);如果再触发展现 Virtual DOM diff,减少不必要操作 (cnblogs.com)。
  4. nextTick() 原理:

    • Vue 会维护一个更新队列,当数据变化时,使用 Promise.resolve().then() 把回调排入微任务;
    • 在本轮更新完成之后且 DOM patch 结束前,执行所有 queued callbacks —— 就是 Vue.nextTick(fn) 的实现基础 (cnblogs.com)。

React 实战题 🎯

setState 是同步还是异步?

React 16 以前

  • 在 React 合成事件或生命周期内多个 setState 会批量异步执行;
  • 在原生事件/setTimeout 中则立即同步执行(无批量);
  • isBatchingUpdates 控制逻辑状态,决定是马上更新还是放入队列延迟执行 (interview.poetries.top, interview.poetries.top)。

React 18+(带automatic batching)

  • 默认所有 setState 都批量异步执行,跨同步边界也可合并。

手写精简版 useSetState Hook 用法:

function useSetState(initial) {const [state, setState] = React.useState(initial);const setMerge = React.useCallback(partial => {setState(prev => typeof partial === 'function' ? { ...prev, ...partial(prev) } : { ...prev, ...partial });}, []);return [state, setMerge];
}

✔ 常用于类组件迁移或处理中间复杂状态对象。

自定义 Hook —— “usePrevious” 用来获取上一次的 props / state 值:

function usePrevious(value) {const ref = React.useRef();React.useEffect(() => {ref.current = value;});return ref.current;
}

推荐答题思路 vs ⚙️ 笔试技巧

  • 🎯 原理结合代码实现:例如讲 Promise.all 的状态控制步骤时,要同时写出 .then/.catch 逻辑;
  • 🎯 边界处理:空输入、循环引用、取消节流/防抖、 finally 支持;
  • 🎯 防坑措施:写内容前先声明假设,如 arguments, this 包含性、map.has()
  • 🎯 真实业务场景中的演练:例如:“如果输入框提交 API 想要防抖 + 防止重复提交,你会怎么做?”

最后一击:答题包装建议

步骤做法
✅ 场景定位“这个题是考异步模型 / 响应式设计 / 事件绑定机制。”
✅ 核心原理简练说明背后机制,宏/微任务、依赖追踪、渲染批次等。
⚠️ 关键限制条件讨论 edge-case、API 兼容性、性能影响等。
💬 输出可交付物写出刚才例子代码时,模拟如何现场写白板步骤,用注释提升可读性(why)

掌握以上这四大模块的题型(HTML 布局+JavaScript 常见算法+Vue 响应式系统+React 状态更新策略),你在面试现场就可以胸有成竹地写出代码、讲清原理、回答补充问题。祝你面试拿 offer,写题不打烊!


前端面试中的场景题旨在考察候选人对实际开发问题的理解与解决能力。以下是一些高频场景题及其解析,供您参考:


以下是前端面试中HTML、JS、Vue、React的常考基础题目详解及代码解析,结合高频考点和实战需求整理:

一、HTML 核心考点

  1. 语义化标签
    • 作用:提升代码可读性、SEO优化(如

    替代

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94235.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

道格拉斯-普克算法 - 把一堆复杂的线条变得简单,同时尽量保持原来的样子

道格拉斯-普克算法 - 把一堆复杂的线条变得简单&#xff0c;同时尽量保持原来的样子 flyfish 道格拉斯-普克算法&#xff08;Douglas-Peucker Algorithm解决的问题其实很日常&#xff1a;把一堆复杂的线条&#xff08;比如地图上的道路、河流&#xff0c;或者GPS记录的轨迹&…

团购商城 app 系统架构分析

一、引言 团购商城 APP 作为一种融合了电子商务与团购模式的应用程序&#xff0c;近年来在市场上取得了显著的发展。它为用户提供了便捷的购物体验&#xff0c;同时也为商家创造了更多的销售机会。一个完善且高效的系统架构是保障团购商城 APP 稳定运行、提供优质服务的基础。本…

【AI平台】n8n入门7:本地n8n更新

✅0、前言 目标&#xff1a;本地n8n部署后&#xff0c;有新版本&#xff0c;然后进行更新。官方文档&#xff1a;Docker | n8n Docs特别说明&#xff1a; n8n镜像更新后&#xff0c;容器重建&#xff0c;所以之前在n8n配置的东西&#xff0c;就莫有了&#xff0c;工作流提前导…

还在使用Milvus向量库?2025-AI智能体选型架构防坑指南

前言说明&#xff1a;数据来源&#xff1a;主要基于 Milvus&#xff08;v2.3&#xff09;和 Qdrant&#xff08;v1.8&#xff09;的最新稳定版&#xff0c;参考官方文档、GitHub Issues、CNCF报告、以及第三方评测&#xff08;如DB-Engines、TechEmpower&#xff09;。评估原则…

3-verilog的使用-1

verilog的使用-1 1.判断上升沿 reg s_d0; reg s_d1; wire signal_up ; //判断信号的上升沿 assign signal_up (~touch_key_d1) & touch_key_d0; always (posedge clk or negedge rst_n) beginif(rst_n 1b0) begins_d0< 1b0;s_d1< 1b0;endelse begins_d0&…

ESXI虚拟交换机 + H3C S5120交换机 + GR5200路由器组网笔记

文章目录一、组网拓扑与核心逻辑1. 拓扑结构2. 核心逻辑二、详细规划方案1. VLAN 与 IP 地址规划2. 设备连接规划三、配置步骤1. H3C S5120 交换机配置&#xff08;VLAN 与端口&#xff09;2. H3C GR5200 路由器配置&#xff08;路由、网关、NAT&#xff09;3. ESXi 虚拟交换机…

python的驾校培训预约管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 该系统通…

webrtc弱网-QualityScaler 源码分析与算法原理

一. 核心功能QualityScaler 是 WebRTC 中用于动态调整视频编码质量的模块&#xff0c;主要功能包括&#xff1a;QP 监控&#xff1a;持续监测编码器输出的量化参数&#xff08;QP&#xff09;丢帧率分析&#xff1a;跟踪媒体优化和编码器导致的丢帧情况自适应决策&#xff1a;根…

Maven 快照(SNAPSHOT)

Maven 快照(SNAPSHOT) 引言 Maven 快照(SNAPSHOT)是 Maven 中的一个重要概念,主要用于版本管理。它允许开发者在构建过程中使用尚未发布的版本。本文将详细介绍 Maven 快照的原理、用途以及如何在项目中配置和使用快照。 Maven 快照原理 Maven 快照是版本号的一部分,…

2025-0803学习记录20——毕业论文快速整理成小论文

本科毕业论文写好啦&#xff0c;但是C导要我整理成一篇约8000字的小论文&#xff0c;准备投稿。毕业论文到投稿的小论文&#xff0c;这其实是从“全景展示”到“聚焦精炼”的过程。目前我已经有完整的大论文&#xff08;约6万字&#xff09;&#xff0c;材料是充足的&#xff0…

VUE2 学习笔记16 插槽、Vuex

插槽在编写组件时&#xff0c;可能存在这种情况&#xff0c;页面需要显示不同的内容&#xff0c;但是页面结构是类似的&#xff0c;在这种情况下&#xff0c;虽然也可以使用传参来进行&#xff0c;但传参时&#xff0c;还需要编写props等逻辑&#xff0c;略显重复&#xff0c;而…

IntelliJ IDEA开发编辑器摸鱼看股票数据

在IDEA的插件市场中心搜索stock&#xff0c;检索结果里面的插件&#xff0c;点击安装即可安装后的效果

Linux Deepin深度操作系统应用商店加载失败,安装星火应用商店

Linux Deepin国产操作系统优点 Deepin&#xff08;原名Linux Deepin&#xff09;是一款由中国团队开发的Linux发行版&#xff0c;基于Debian stable分支&#xff0c;以美观易用的界面和本土化体验著称。以下是其核心优点总结&#xff1a; 1. 极致美观的界面设计 Deepin Deskt…

postgresql创建只读用户并授权

postgresql创建只读用户并授权 CREATE USER yk WITH ENCRYPTED PASSWORD <your_password>;GRANT USAGE ON SCHEMA public to yk; GRANT SELECT ON ALL TABLES IN SCHEMA public TO yk;根据以上创建的用户&#xff0c;出现一个问题&#xff0c;对新建的表没有查询权限&am…

pytest vs unittest: 区别与优缺点比较

主要区别特性pytestunittest起源第三方库Python标准库语法风格更简洁的Pythonic语法基于Java风格的JUnit测试发现自动发现测试需要继承TestCase类断言方式使用Python原生assert使用各种assert方法(assertEqual等)夹具系统强大的fixture系统简单的setUp/tearDown方法参数化测试内…

Boost.Asio学习(5):c++的协程

协程是什么&#xff1f;协程就是可以“暂停”和“继续”的函数&#xff0c;像在函数里打个断点&#xff0c;然后以后可以从断点继续运行&#xff0c;而不是重新开始。线程 vs 协程&#xff1a;类比想象你在写小说&#xff1a;线程&#xff1a;你开了 3 个作者&#xff08;线程&…

Linux 中,命令查看系统版本和内核信息

在 Linux 中&#xff0c;可以通过以下命令查看系统版本和内核信息&#xff1a;1. 查看内核版本uname -a或精简显示&#xff1a;uname -r # 只显示内核版本示例输出&#xff1a;Linux ubuntu 5.4.0-135-generic #152-Ubuntu SMP Tue Nov 15 08:12:21 UTC 2022 x86_64 x86_64 x8…

数据结构总纲以及单向链表详解:

以下是基于笔记更详细的知识梳理&#xff0c;从概念到细节逐层拆解&#xff0c;帮你吃透数据结构核心要点&#xff1a; 数据结构部分的重点内容&#xff1a;一、数据结构基础框架 &#xff08;一&#xff09;逻辑结构&#xff08;关注元素间“逻辑关系”&#xff09; 笔记里提到…

模型学习系列之参数

背景 “GLM-4.5拥有 3550 亿总参数量&#xff0c;其中 320 亿活跃参数&#xff1b;GLM-4.5-Air 采用更紧凑的设计&#xff0c;拥有 1060 亿总参数量&#xff0c;其中 120 亿活跃参数。” 定义与关系 总参数量&#xff1a;模型中所有可训练参数的总和&#xff08;包括嵌入层、注…

[创业之路-535]:软件需要原型验证、产品需要原型验证、商业模式也需要原型验证

原型验证在软件、产品开发以及商业模式探索中均扮演着至关重要的角色&#xff0c;它通过低成本、快速迭代的方式&#xff0c;帮助团队验证核心假设、降低风险并优化方案。以下是针对这三个领域的具体分析&#xff1a;一、软件原型验证&#xff1a;从概念到可交互的模型核心目的…