logo

前端面试题汇总大全(含答案)-- 持续更新

作者:4042025.10.11 20:06浏览量:406

简介:全面汇总前端开发高频面试题及答案解析,涵盖HTML/CSS/JS/框架/性能优化等核心领域,持续更新最新技术栈问题,助力开发者高效备战面试。

前端面试题汇总大全(含答案)— 持续更新

一、HTML与CSS基础篇

1.1 HTML语义化标签的应用场景

问题:HTML5新增的语义化标签(如<header><section><article>)在实际开发中有何优势?
答案

  • SEO优化:语义化标签帮助搜索引擎理解页面结构,例如<article>标签内的内容会被优先识别为独立文章。
  • 可访问性提升:屏幕阅读器通过语义化标签解析内容层级,例如<nav>标签明确导航区域。
  • 代码可维护性:相比<div>滥用,语义化标签能直观表达区块功能,如<figure>配合<figcaption>展示带标题的图片。
    扩展建议:在团队规范中强制使用语义化标签,并通过工具(如HTMLHint)检查标签滥用问题。

1.2 CSS盒模型与布局技巧

问题:如何实现一个固定宽高的元素在页面中水平垂直居中?
答案(Flexbox方案):

  1. .container {
  2. display: flex;
  3. justify-content: center; /* 水平居中 */
  4. align-items: center; /* 垂直居中 */
  5. height: 100vh; /* 视口高度 */
  6. }

深度解析

  • 传统方案局限:绝对定位+transform: translate(-50%, -50%)需已知元素尺寸,而Flexbox无需计算。
  • Grid方案对比display: grid; place-items: center;代码更简洁,但Flexbox在一维布局中更灵活。
    性能优化:避免在频繁渲染的元素上使用复杂布局,优先选择静态布局方案。

二、JavaScript核心篇

2.1 闭包与作用域链

问题:以下代码输出什么?如何避免内存泄漏?

  1. function outer() {
  2. let count = 0;
  3. return function inner() {
  4. count++;
  5. console.log(count);
  6. };
  7. }
  8. const increment = outer();
  9. increment(); // 输出?
  10. increment(); // 输出?

答案

  • 输出依次为12,因闭包保留了对count的引用。
  • 内存泄漏风险:若outer被频繁调用且inner未被释放,会导致count长期驻留内存。
    解决方案
    1. // 显式解除引用
    2. let increment;
    3. function outer() {
    4. let count = 0;
    5. increment = function() { /* ... */ };
    6. return function() {
    7. increment = null; // 手动释放
    8. };
    9. }

2.2 异步编程与Promise

问题:实现一个并发数控制的Promise调度器。
答案(代码实现):

  1. class Scheduler {
  2. constructor(limit) {
  3. this.queue = [];
  4. this.activeCount = 0;
  5. this.limit = limit;
  6. }
  7. add(promiseCreator) {
  8. return new Promise((resolve) => {
  9. this.queue.push(() => promiseCreator().then(resolve));
  10. this.run();
  11. });
  12. }
  13. run() {
  14. while (this.activeCount < this.limit && this.queue.length) {
  15. const task = this.queue.shift();
  16. task();
  17. this.activeCount++;
  18. }
  19. }
  20. done() {
  21. return new Promise((resolve) => {
  22. if (this.activeCount === 0 && this.queue.length === 0) {
  23. resolve();
  24. } else {
  25. // 监听所有任务完成
  26. }
  27. });
  28. }
  29. }

应用场景:限制API请求并发数,避免触发频率限制。

三、框架与工程化篇

3.1 React Hooks使用陷阱

问题:以下代码有何问题?如何修复?

  1. function Counter() {
  2. const [count, setCount] = useState(0);
  3. const handleClick = () => {
  4. setTimeout(() => {
  5. setCount(count + 1); // 问题点
  6. }, 1000);
  7. };
  8. return <button onClick={handleClick}>{count}</button>;
  9. }

答案

  • 问题:闭包捕获了初始的count值,导致多次点击后计数不准确。
  • 修复方案:使用函数式更新或useRef跟踪最新值。
    ```javascript
    // 方案1:函数式更新
    setCount(prev => prev + 1);

// 方案2:useRef
const countRef = useRef();
countRef.current = count;
setTimeout(() => setCount(countRef.current + 1), 1000);

  1. ### 3.2 Vue3响应式原理
  2. **问题**:Vue3`reactive``ref`有何区别?
  3. **答案**:
  4. - **`reactive`**:通过Proxy实现深度响应式,适用于对象类型。
  5. ```javascript
  6. const state = reactive({ count: 0 });
  • ref:包装基本类型值为响应式对象,需通过.value访问。
    1. const count = ref(0);
    2. console.log(count.value); // 访问值
    选择建议
  • 对象类型优先用reactive,避免.value冗余代码。
  • 基本类型或需在模板外使用的值用ref

四、性能优化篇

4.1 浏览器渲染机制

问题:如何减少重排(Reflow)和重绘(Repaint)?
答案

  • 批量DOM操作:使用DocumentFragment或虚拟DOM。
    1. const fragment = document.createDocumentFragment();
    2. for (let i = 0; i < 100; i++) {
    3. const div = document.createElement('div');
    4. fragment.appendChild(div);
    5. }
    6. document.body.appendChild(fragment);
  • CSS优化:避免width/height/margin等触发重排的属性频繁变更,改用transform
  • 工具检测:使用Chrome DevTools的Performance面板分析渲染瓶颈。

4.2 代码分割与懒加载

问题:如何在React中实现路由级代码分割?
答案(React.lazy + Suspense):

  1. const Home = React.lazy(() => import('./Home'));
  2. function App() {
  3. return (
  4. <Suspense fallback={<div>Loading...</div>}>
  5. <Route path="/" component={Home} />
  6. </Suspense>
  7. );
  8. }

Webpack配置:确保output.chunkFilename设置为[name].chunk.js以便区分异步模块。

五、持续更新机制

本文章将通过以下方式保持内容时效性:

  1. 月度更新:根据MDN/TC39最新规范修订答案。
  2. 读者贡献:开放GitHub仓库(示例链接)接收PR补充新题。
  3. 框架专项:针对Vue3/React18等新版本增设章节。

建议行动:收藏本文并订阅更新通知,同时参与社区讨论完善题库。

相关文章推荐

发表评论

活动