发布于 2026-01-06 5 阅读
0

40 道前端开发人员面试题

40 道前端开发人员面试题

1. 问题:你能解释一下 JavaScript 中`<script>`、`<script>` 和`<script>` 之间的区别吗?varletconst

回答:

  • var函数作用域,可以重新声明和更新。它会被提升,这意味着它的声明会在编译时被移动到其作用域的顶部。
  • let块级作用域,可以更新但不能在同一作用域内重新声明。它不会像其他变量那样被提升var
  • const块级作用域,不可更新或重新声明。必须在声明时赋值。它提供了一种定义常量的方法。
  • 使用letconst有助于防止因范围问题和意外重新分配而导致的常见错误。

2. 问: 如何在 React 应用中管理状态?

答:

React 中的状态管理可以通过以下方式实现:

  • 本地组件状态:在简单场景中使用useState或类组件状态。
  • 上下文 API:用于解决 prop 传递问题,无需在每一层手动向下传递 props 即可通过组件树传递数据。
  • 状态管理库:例如 Redux、MobX 或 Zustand,适用于需要全局状态的复杂应用程序。
  • Hooks:用于封装和重用有状态逻辑的自定义钩子。
  • React Query 或 SWR:用于服务器状态管理。
  • 选择取决于应用程序的复杂程度和要求。

3. 问题: 什么是虚拟 DOM,React 如何使用它?

回答:

  • 虚拟DOM是 React 组件生成的真实 DOM 元素的内存表示。
  • 当组件状态发生变化时,React 会更新虚拟 DOM 树。
  • 然后,它高效地计算出更新实际 DOM 所需的最小更改集(差异)。
  • 该过程通过减少对 DOM 的直接操作(这是一项开销很大的操作)来提高性能。

4. 问题: 解释 JavaScript 中的事件委托。

答案:

  • 事件委托利用事件冒泡机制,在 DOM 的更高层级(而不是单个节点)处理事件。
  • 与其为每个子元素添加事件监听器,不如将单个事件监听器附加到父元素上。
  • 当子元素上触发事件时,该事件会向上冒泡到父元素,在那里可以被捕获和处理。
  • 这种方法可以提高性能并简化代码管理,尤其是在处理动态添加的元素时。

5. 问: 什么是 Web 组件?它们与自定义元素有何关系?

答:

  • Web Components是一组标准化的 API,可用于创建可重用的、封装的 HTML 标签。
  • 它们包括:
    • 自定义元素:定义新的 HTML 元素类型。
    • Shadow DOM:为样式和标记提供封装。
    • HTML模板:允许您定义可重用的模板。
  • 自定义元素是 Web 组件的关键组成部分,它允许开发人员创建具有自定义行为和样式的自己的 HTML 标签。

6. 问: CSS 样式优先级是如何工作的?

答:

CSS 样式优先级决定了当多个样式规则可能适用时,哪些样式规则应用于该元素:

  • 内联样式style属性)具有最高的特异性。
  • ID#id)比类别具有更高的特异性。
  • 类、属性和伪类.class,,[type="text"]:hover具有中等特异性。
  • 元素和伪元素div::before)的特异性最低。
  • 特异性是根据选择器的组合计算的。当特异性相同时,最后定义的规则优先。

7. 问题: JavaScript 中的 Promise 是什么?它与回调函数有何不同?

答案:

  • Promise是表示异步操作最终完成或失败的对象。
  • 它们提供了诸如.then().catch()和之类的方法.finally()来处理异步结果。
  • 承诺与回调:
    • Promise可以编写更简洁、更易于维护的异步代码,并实现更好的错误处理。
    • 回调函数可能会导致“回调地狱”,嵌套的回调函数会使代码难以阅读和维护。
  • 与传统的回调函数相比,Promise 可以提高代码的可读性和可管理性。

8. 问: 你能解释一下 JavaScript 中的闭包是如何工作的吗?

答:

  • 是一种能够记住其外部变量并可以访问这些变量的函数。
  • 这意味着一个函数可以访问自身作用域、外部函数作用域和全局作用域中的变量。
  • 每次创建函数时,都会在函数创建时创建闭包。
  • 它们对数据隐私和模拟私密方法很有用。

9. 问: 如何优化Web应用程序的性能?

答:

  • 减少HTTP请求:合并文件,使用精灵图。
  • 异步加载:用于async脚本defer
  • 缓存:实施浏览器缓存并使用内容分发网络(CDN)。
  • 优化图像:压缩图像并使用 WebP 等下一代格式。
  • 代码分割:使用 Webpack 等工具分割代码以实现延迟加载。
  • 减少渲染阻塞资源:优化 CSS 和 JavaScript 的交付。
  • 性能监控:使用 Lighthouse 和 Chrome DevTools 等工具进行审核。

10. 问: 在渐进式 Web 应用 (PWA) 中,Service Worker 的用途是什么?

答:

  • Service Worker充当Web应用程序和网络之间的代理。
  • 它们通过缓存资源和拦截网络请求来实现离线支持等功能。
  • 支持后台同步和推送通知。
  • 通过控制资源缓存和检索来提高性能。

11. 问题: 解释 CSS 中的盒模型。

答案:

  • CSS盒模型是一个包裹所有HTML元素的盒子。
  • 它由以下部分组成:
    • 内容:实际的内容,例如文本或图像。
    • 内边距:边框内内容周围的空间。
    • 边框:围绕内边距和内容的边框。
    • 页边距:此元素与其他元素之间边界之外的空间。
  • 理解箱形模型对于布局和设计至关重要。

12. 问题: React 中的高阶组件(HOC)是什么?

答案:

  • 高阶组件(HOC)是一种接受一个组件并返回一个新组件的函数。
  • 它们用于在组件之间共享通用功能。
  • 高阶组件可以注入属性、管理状态或处理副作用。
  • 用法示例:const EnhancedComponent = withFeature(WrappedComponent);

13. 问题: 如何确保 Web 应用程序的可访问性?

回答:

  • 使用语义化的HTML:正确使用HTML元素。
  • ARIA属性:在必要时提供更多上下文信息。
  • 键盘导航:确保所有交互元素都可以通过键盘访问。
  • 对比度和易读性:使用适当的颜色对比度和字体大小。
  • 图片替代文字:提供描述性alt属性。
  • 测试:使用无障碍测试工具和辅助技术。

14. 问题: 什么是跨域资源共享(CORS),它是如何工作的?

回答:

  • CORS是一种安全功能,用于允许或限制从其他域请求的资源。
  • 它的工作原理是添加 HTTP 标头,指定允许哪些来源读取响应。
  • 浏览器会强制执行 CORS 策略,服务器必须包含适当的标头,例如Access-Control-Allow-Origin
  • 预检请求(OPTIONS方法)用于检查权限的复杂请求。

15. 问题: 请描述如何在Web应用程序中实现延迟加载。

答案:

  • 图片和媒体相关内容:
    • 在标签中使用该loading="lazy"属性。<img>
    • 实现交叉观察者 API,以便在媒体进入视口时加载媒体。
  • 代码:
    • 使用 Webpack 或其他打包工具时,请使用动态导入。
    • 在 React 中,使用React.lazy()`and`Suspense进行组件级代码拆分。
  • 好处:
    • 提高初始加载速度和性能。
    • 减少不必要的数据使用。

16. 问题: JavaScript 中的`and` 和 `or`有什么区别?=====

回答:

  • ==(抽象相等性):如果类型不同,则在执行类型强制转换后比较值。
  • ===(严格相等性):比较值和类型,而不进行类型强制转换。
  • 例子:
    • 0 == '0'true
    • 0 === '0'false
  • 通常建议使用这种方法===,以避免因类型强制而导致意外结果。

17. 问: 如何处理异步代码中的错误?

答:

  • Promise:用于.catch()处理拒绝。
  • Async/await:将调用await包装在try...catch代码块中。
  • 全局错误处理程序:用于处理未处理的 Promise 拒绝。
  • 错误边界(React):捕获组件树中的错误。
  • 妥善的错误处理能够确保更好的用户体验和更便捷的调试。

18. 问题: 解释响应式设计的概念以及如何实现它。

回答:

  • 响应式设计确保网站能够适应各种屏幕尺寸和设备。
  • 执行:
    • 使用 CSS Flexbox 或 Grid 实现灵活的网格布局。
    • 实现媒体查询,根据视口大小调整样式。
    • em使用百分比或等相对单位rem
    • 针对不同屏幕分辨率优化图像。
  • 测试:使用浏览器开发者工具和物理设备测试响应能力。

19. 问: 什么是 CSS 预处理器?为什么要使用它?

答:

  • CSS 预处理器通过添加变量、嵌套、混合和函数等功能来扩展 CSS 的功能。
  • 例如SassLessStylus
  • 好处:
    • 代码重用性和可维护性。
    • 更容易管理大型 CSS 代码库。
    • 可以编译成标准 CSS 格式,以兼容各种浏览器。

20. 问: 你能解释一下不可变性的概念及其在 React 中的重要性吗?

答:

  • 不可变性意味着数据一旦创建就不能更改。
  • 在 React 中,不可变性非常重要,因为它:
    • 允许可预测的状态变化。
    • 有助于性能优化,因为 React 可以进行浅层比较。
    • 避免产生意想不到的副作用。
  • 执行:
    • 使用返回数据结构新副本的方法,例如使用Object.assign扩展运算符。
    • 对于复杂的数据结构,可以使用 Immutable.js 等库。

21. 问: 什么是 Webpack?它有什么用途?

答:

  • Webpack是一个用于 JavaScript 应用程序的模块打包工具。
  • 用途:
    • 将 JavaScript 文件打包,以便在浏览器中使用。
    • 通过加载器处理和打包 CSS、图像和字体等资源。
    • 启用代码分割和延迟加载。
    • 支持插件以扩展功能。
  • 好处:
    • 高效管理依赖关系。
    • 优化生产资源配置。

22. 问: 如何防止跨站脚本攻击(XSS)?

答:

  • 输入清理:在服务器端清理和验证所有用户输入。
  • 输出编码:在浏览器中呈现用户输入之前对其进行转义。
  • 内容安全策略(CSP):定义可信的内容来源,以防止恶意脚本的发生。
  • 避免使用内联脚本:将 JavaScript 代码放在外部文件中。
  • 使用 HTTPOnly Cookies:防止通过 JavaScript 访问 cookies。
  • 定期安全审计:及时了解最新的安全最佳实践。

23. 问: 使用单页应用程序(SPA)有哪些优点和缺点?

答:

  • 好处:
    • 用户体验流畅,无需重新加载整个页面。
    • 初始负载后性能更佳。
    • 更容易打造类似移动设备的体验。
  • 缺点:
    • 虽然可以通过服务器端渲染来缓解 SEO 方面的挑战,但这并非没有办法。
    • 初始加载时间可能会比较长。
    • 浏览器历史记录管理可能很复杂。
  • 选择单页应用程序 (SPA) 还是传统多页应用程序取决于项目需求。

24. 问: JavaScript 中的关键字是如何工作的?this

答:

  • this指的是正在执行当前函数的对象。
  • 背景:
    • 全局上下文: this指的是全局对象(window在浏览器中)。
    • 对象方法: this指的是拥有该方法的对象。
    • 事件处理程序: this指的是触发事件的 DOM 元素。
    • 箭头函数:没有自己的作用域this;它们从封闭作用域继承作用域。
  • 理解this对于 JavaScript 中的面向对象编程至关重要。

25. 问题: 解释 RESTful API 和 GraphQL 之间的区别。

答案:

  • RESTful API:
    • 使用HTTP方法和端点访问资源。
    • 数据是围绕资源组织的。
    • 可能导致数据过度获取或获取不足。
  • GraphQL:
    • 使用单个端点。
    • 客户会明确说明他们需要哪些数据。
    • 减少网络请求次数。
    • 需要模式和解析器。
  • 选择因素:
    • 项目需求、数据复杂性和团队专业水平。

26. 问: 如何在大型 React 应用中管理样式?

答:

  • CSS Modules:将 CSS 类限定于组件的局部作用域。
  • Styled Components:一个允许在 JavaScript 中编写 CSS 的 CSS-in-JS 库。
  • Sass/Less:使用预处理器实现高级 CSS 功能。
  • BEM 方法论:用于命名约定和组织。
  • 主题化:使用上下文或库来提供一致的样式。
  • 具体方法取决于团队偏好和项目需求。

27. 问: 什么是 React Hooks?为什么要引入它们?

答:

  • React Hooks是一些函数,它们允许你在不编写类的情况下使用状态和其他 React 功能。
  • 常用钩子:
    • useState用于状态管理。
    • useEffect副作用。
    • useContext用于上下文 API。
  • 引入原因:
    • 简化函数式组件中的状态逻辑。
    • 避免类的复杂性。
    • 通过自定义钩子实现更好的代码重用。

28. 问题: 请描述如何在单页应用程序中实现身份验证。

答案:

  • 基于令牌的身份验证:
    • 使用安全存储的 JWT(最好存储在仅限 HTTP 的 cookie 中)。
    • 实现登录流程以接收和存储令牌。
  • 路由保护:
    • 使用高阶组件或路由保护器来保护已认证的路由。
  • 后端集成:
    • 设置用于身份验证的 API 端点。
    • 在服务器端验证令牌。
  • 安全考量:
    • 防范 XSS 和 CSRF 攻击。
    • 使用HTTPS加密数据传输。

29. 问: 什么是函数式编程?它如何应用于 JavaScript?

答:

  • 函数式编程是一种将计算视为数学函数求值的编程范式。
  • 核心概念:
    • 纯函数:没有副作用,对于相同的输入返回相同的输出。
    • 不可篡改性:数据创建后不会更改。
    • 一等函数:函数被视为值。
    • 高阶函数:接受其他函数或返回其他函数的函数。
  • 在 JavaScript 中:
    • 支持函数式编程,具有 map、reduce、filter 和函数表达式等功能。

30. 问: 你们如何处理浏览器兼容性和 polyfill?

答:

  • 功能检测:使用 Modernizr 或类似工具检测不支持的功能。
  • Polyfill:包含可在旧版浏览器中复制现代功能的脚本(例如,Babel polyfill)。
  • 转译:使用 Babel 等工具将 ES6+ 代码转换为 ES5 代码。
  • 渐进增强:构建可在所有浏览器上运行的功能,并在可能的情况下进行增强。
  • 测试:定期在不同的浏览器和设备上进行测试。
  • 用法Can I Use实施前请检查功能支持情况。

31. 问: 什么是用户中心设计?

答:

用户中心设计是指在设计的每一个步骤中都以用户为中心。通过关注用户的真实需求,并让他们参与到整个开发过程中,产品更有可能获得成功、更加用户友好,并满足目标受众的实际需求。

32. 问: 什么是回调地狱?

答:

回调地狱指的是使用多个嵌套回调函数的反模式,这会导致代码难以阅读和维护。通过使用 Promise、Async/Await 和合理的代码结构,您可以编写更简洁的异步代码,避免陷入回调地狱。

33. 问: SOLID 代表什么?

答:

SOLID 原则为开发人员构建易于管理、扩展和伸缩的软件提供了指导。遵循这些原则,您可以创建经得起时间考验并能优雅地适应新需求的健壮系统。

34. 问: 什么是点击劫持?

答:

点击劫持,也称为“用户界面篡改攻击”,是一种恶意技术,攻击者诱骗用户点击与用户预期不同的内容,这可能导致未经授权的操作或泄露机密信息。

例如:

  • 用户访问一个恶意网站,该网站会在虚假的“播放视频”按钮下方加载银行网站的登录按钮。当用户点击播放视频时,实际上是点击了银行网站上的登录按钮,这可能会触发意想不到的操作。

35. 问: JavaScript 中的强制类型转换是什么?

答:

JavaScript 中的强制类型转换是指将值从一种数据类型转换为另一种数据类型的过程。JavaScript 以两种方式执行强制类型转换:隐式(自动)和显式(手动)。

36. 问: JavaScript 中的 IIFE 是什么?

答:

IIFE(立即调用函数表达式)是一种 JavaScript 函数,它在定义后立即执行。它是一种设计模式,为你的代码提供了一个私有作用域。

37. 问: CSS中的网格系统是什么?

答:

CSS中的网格系统是一种布局框架,它允许开发人员轻松创建复杂的响应式网页设计。它提供了一种结构化的方式来按行和列排列内容,从而方便创建响应式和灵活的布局。

38. 问: JavaScript 中的命名空间是什么?

答:

在 JavaScript 中,命名空间是一个容器,它允许开发者将相关的代码分组到一个唯一的名称下,以避免命名冲突并保持全局作用域的整洁。由于 JavaScript 不像其他一些语言那样内置命名空间支持,开发者可以使用对象、模块或立即调用函数表达式 (IIFE) 来创建命名空间。

39. 问: JavaScript 中指令有什么用途?use strict

答:

指令use strict用于编写更简洁、更不容易出错的 JavaScript 代码。它可以捕获常见的编码错误,例如未声明变量就赋值,或者向函数传递同名参数等。

40. 问题: 将 defer 或 async 属性传递给 script 标签的目的是什么?

答案:

deferorasync属性传递给<script>标签可以控制浏览器如何加载和执行外部 JavaScript 文件,通过优化脚本处理来提高页面加载性能。

defer属性

  • 目的:指示浏览器在解析 HTML 的同时下载脚本,但延迟执行,直到整个文档解析完毕。
  • 行为
    • 非阻塞式:不会停止 HTML 解析。
    • 执行时间:在 DOM 完全构建完成后但在DOMContentLoaded事件发生之前执行。
    • 顺序保留:如果存在多个脚本defer,则它们按照在文档中出现的顺序执行。
  • 使用场景:非常适合依赖于 DOM 或需要维护执行顺序的脚本。

例子

  <script src="script.js" defer\>\</script\>  
Enter fullscreen mode Exit fullscreen mode

async属性

  • 目的:告诉浏览器并行下载脚本,并在脚本准备就绪后立即执行,而无需等待 HTML 解析完成。
  • 行为
    • 非阻塞式:下载过程中不会暂停 HTML 解析。
    • 执行时间:下载完成后立即执行,这可能发生在 DOM 准备就绪之前或之后。
    • 执行顺序无法保证:如果使用多个异步脚本,则执行顺序不可预测。
  • 使用场景:适用于不依赖于其他脚本或 DOM 的独立脚本,例如分析脚本或广告脚本。

例子

  <script src="analytics.js" async\>\</script\>  
Enter fullscreen mode Exit fullscreen mode

概括

  • 主要目的:这两个属性通过允许 HTML 解析和脚本下载同时进行来提高页面性能,从而减少阻塞渲染的脚本。
  • defer在两者之间进行选择async
    • defer当脚本依赖于 DOM 或需要按顺序执行时,请使用此功能。
    • 适用async于可以独立运行且执行顺序无关紧要的脚本。
文章来源:https://dev.to/grenishrai/40-frontend-developer-interview-questions-51oc