2025前端面试题超全面解析(附答案与深度扩展)

发布于:2025-02-15 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、HTML篇(扩展版)

1. HTML5语义化标签的实际应用场景

答案

  • 场景
    • <header>:页面头部或文章头部。
    • <nav>:主导航栏。
    • <article>:独立内容块(如博客文章)。
    • <aside>:侧边栏或广告区域。
    • <time datetime="2025-01-01">:时间语义化,便于SEO和机器解析。
  • SEO优化:搜索引擎优先抓取语义化标签内容。

2. Web Components实战:如何封装一个自定义按钮组件?

答案

<!-- 定义模板 -->
<template id="custom-button">
  <style>
    .btn { padding: 10px 20px; background: blue; color: white; }
  </style>
  <button class="btn"><slot></slot></button>
</template>

<script>
  class CustomButton extends HTMLElement {
    constructor() {
      super();
      const template = document.getElementById('custom-button');
      const shadowRoot = this.attachShadow({ mode: 'open' });
      shadowRoot.appendChild(template.content.cloneNode(true));
    }
  }
  customElements.define('custom-button', CustomButton);
</script>

<!-- 使用 -->
<custom-button>点击我</custom-button>

3. Web Worker的用途与限制

答案

  • 用途:执行耗时任务(如大数据计算)避免阻塞主线程。
  • 限制
    • 不能直接操作DOM。
    • 通过postMessage与主线程通信。
  • 示例
    // 主线程
    const worker = new Worker('worker.js');
    worker.postMessage({ data: 1000 });
    worker.onmessage = (e) => console.log(e.data);
    
    // worker.js
    self.onmessage = (e) => {
      const result = heavyCalculation(e.data);
      self.postMessage(result);
    };
    

二、CSS篇(扩展版)

1. CSS盒模型详解:border-box vs content-box

答案

  • content-box(默认):元素宽度 = width + padding + border。
  • border-box:元素宽度 = width(包含padding和border)。
  • 应用场景
    /* 全局设置为border-box更易布局 */
    * { box-sizing: border-box; }
    

2. CSS动画性能优化技巧

答案

  • 优先使用transformopacity:这两个属性不会触发重排(Composite阶段)。
  • 避免频繁修改width/height:触发重排,改用scale
  • 启用GPU加速
    .animate { transform: translateZ(0); }
    

3. CSS预处理器(Sass/Less)核心功能对比

答案

功能 Sass(SCSS) Less
变量 $primary-color: #333; @primary-color: #333;
嵌套 支持媒体查询嵌套 支持常规嵌套
Mixin @mixin flex { display: flex; } .flex() { display: flex; }
模块化 @use 'module' @import 'module.less'

三、JavaScript篇(扩展版)

1. ES6+核心特性:Promise、Generator、Async/Await对比

答案

  • Promise:解决回调地狱,链式调用(.then())。
  • Generator:通过yield暂停执行,手动控制流程(需配合co库)。
  • Async/Await:语法糖,基于Promise,代码更同步化。
  • 示例
    // Async/Await
    async function fetchData() {
      const res = await fetch('api/data');
      return res.json();
    }
    

2. JavaScript内存泄漏排查与预防

答案

  • 常见场景
    • 未清理的定时器:setInterval
    • 闭包中未释放的变量。
    • 未解绑的DOM事件监听。
  • 工具:Chrome DevTools的Memory面板。
  • 预防
    // 清除定时器
    const timer = setInterval(() => {}, 1000);
    clearInterval(timer);
    
    // 解绑事件
    element.removeEventListener('click', handler);
    

四、TypeScript篇(扩展版)

1. 高级类型工具:Partial、Pick、Record详解

答案

  • Partial:将T的所有属性设为可选。
  • Pick<T, K>:从T中选择属性K。
  • Record<K, T>:定义键为K、值为T的对象。
  • 示例
    interface User { id: number; name: string; }
    type PartialUser = Partial<User>; // { id?: number; name?: string; }
    type NameOnly = Pick<User, 'name'>; // { name: string; }
    type UserMap = Record<string, User>; // { [key: string]: User }
    

2. TS装饰器的应用场景(Class、Method、Property)

答案

  • 类装饰器:扩展类功能(如日志注入)。
  • 方法装饰器:拦截方法调用(如权限校验)。
  • 属性装饰器:监听属性变化。
  • 示例
    function Log(target: any, methodName: string, descriptor: PropertyDescriptor) {
      const original = descriptor.value;
      descriptor.value = function (...args: any[]) {
        console.log(`调用方法 ${methodName}`);
        return original.apply(this, args);
      };
    }
    
    class Service {
      @Log
      getData() { /* ... */ }
    }
    

五、Vue篇(扩展版)

1. Vue3 Teleport组件的作用与实战

答案

  • 作用:将组件渲染到DOM树的任意位置(如模态框、通知)。
  • 示例
    <template>
      <teleport to="body">
        <div class="modal">内容</div>
      </teleport>
    </template>
    

2. Vuex与Pinia的对比与迁移策略

答案

特性 Vuex Pinia
API设计 基于Options API 基于Composition API
TypeScript 需要额外类型声明 原生支持
模块化 需要手动划分模块 自动按文件划分模块
推荐场景 Vue2项目 Vue3新项目

六、React篇(扩展版)

1. React性能优化:memo、useMemo、useCallback

答案

  • React.memo:缓存函数组件,避免无意义渲染。
  • useMemo:缓存计算结果,避免重复计算。
  • useCallback:缓存函数引用,避免子组件重复渲染。
  • 示例
    const MemoComponent = React.memo(({ data }) => <div>{data}</div>);
    
    function App() {
      const [count, setCount] = useState(0);
      const expensiveValue = useMemo(() => calculate(count), [count]);
      const handleClick = useCallback(() => setCount(c => c + 1), []);
      return (
        <>
          <MemoComponent data={expensiveValue} />
          <button onClick={handleClick}>+1</button>
        </>
      );
    }
    

2. React Server Components(RSC)的核心优势

答案

  • 服务端渲染:组件逻辑在服务端执行,减少客户端JS体积。
  • SEO友好:直接输出HTML内容。
  • 数据获取:在服务端直接访问数据库,无需暴露API。

七、UI框架篇(扩展版)

1. Tailwind CSS vs CSS-in-JS(Styled-components)对比

答案

特性 Tailwind CSS Styled-components
可读性 类名较长但直观 组件化样式,结构清晰
维护性 需记忆工具类 支持动态样式
性能 生产环境自动PurgeCSS 运行时生成样式
适用场景 快速原型开发 复杂动态样式需求

2. 如何实现Ant Design主题动态切换?

答案

  • 步骤1:通过antd-theme-generator生成less变量。
  • 步骤2:动态修改HTML的data-theme属性。
  • 步骤3:使用CSS变量或全局状态管理主题。
  • 代码片段
    // 动态切换主题
    const changeTheme = (theme) => {
      document.documentElement.setAttribute('data-theme', theme);
    };
    

八、综合进阶(扩展版)

1. 前端监控系统搭建:错误采集与性能上报

答案

  • 错误采集
    window.onerror = (message, source, lineno, colno, error) => {
      // 上报错误信息至服务器
    };
    // 监听未处理的Promise错误
    window.addEventListener('unhandledrejection', (e) => {
      e.preventDefault();
      console.error('Unhandled Rejection:', e.reason);
    });
    
  • 性能指标
    • FP/FCP:首次渲染时间。
    • LCP:最大内容渲染时间。
    • CLS:累计布局偏移。

2. WebAssembly在前端的应用场景

答案

  • 图像/视频处理:FFmpeg编译为Wasm加速编解码。
  • 游戏引擎:Unity导出为WebAssembly。
  • 加密计算:高性能加密算法(如SHA-256)。
  • 示例
    // 加载Wasm模块
    WebAssembly.instantiateStreaming(fetch('module.wasm'))
      .then(({ instance }) => {
        const result = instance.exports.add(1, 2);
        console.log(result); // 3
      });
    

九、2025新兴趋势(扩展版)

1. Serverless + Jamstack架构实践

答案

  • 核心思想
    • 前端静态资源托管(如Vercel、Netlify)。
    • 后端使用云函数(AWS Lambda、腾讯云SCF)。
  • 优势:无需运维、按需付费、自动扩展。

2. AI驱动的前端开发:Copilot与低代码结合

答案

  • GitHub Copilot:通过注释生成代码片段。
  • 低代码平台
    • 拖拽生成UI(如Retool、Appsmith)。
    • 集成AI生成业务逻辑。

十、面试加分项

1. 开放性问题:如何设计一个前端微前端架构?

答案

  • 方案选型
    • 基座模式:主应用加载子应用(qiankun)。
    • 去中心化:Webpack Module Federation。
  • 关键技术
    • 应用隔离:CSS沙箱、JS沙箱(Proxy)。
    • 通信机制:CustomEvent或状态管理库。

2. 手写代码:实现一个Promise.all

答案

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let count = 0;
    promises.forEach((promise, index) => {
      promise.then((res) => {
        results[index] = res;
        count++;
        if (count === promises.length) resolve(results);
      }).catch(reject);
    });
  });
}

结语:本文从基础到高阶覆盖了2025年前端核心知识点,建议结合源码实践与项目复盘深入理解。持续关注前沿技术(如Deno、Tauri),保持技术敏感度!