2023前端高薪面试题详解
1. React 中的 hooks 是什么?请详细说明 useState 和 useEffect 的使用场景及案例。
Hooks 是 React 16.8 引入的新特性,允许你在不编写类组件的情况下使用状态和其他 React 特性。Hooks 的出现解决了类组件中的一些痛点,比如状态逻辑复用困难、生命周期方法复杂等。
-
useState: 用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。
案例:
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }
在这个例子中,
useState
初始化了一个状态变量count
,并提供了一个setCount
函数来更新它。每次点击按钮时,count
的值都会增加。 -
useEffect: 用于处理副作用操作,比如数据获取、订阅、手动修改 DOM 等。它类似于类组件中的
componentDidMount
、componentDidUpdate
和componentWillUnmount
的组合。案例:
import React, { useState, useEffect } from 'react'; function Timer() { const [seconds, setSeconds] = useState(0); useEffect(() => { const interval = setInterval(() => { setSeconds(seconds => seconds + 1); }, 1000); return () => clearInterval(interval); // 组件卸载时清除定时器 }, []); return ( <div> <p>Seconds: {seconds}</p> </div> ); }
在这个例子中,
useEffect
在组件挂载时设置了一个定时器,并在组件卸载时清除它,以避免内存泄漏。
2. Vue 3 中的 Composition API 是什么?请详细说明 ref 和 reactive 的使用场景及案例。
Composition API 是 Vue 3 引入的新特性,旨在解决 Vue 2 中 Options API 在处理复杂组件时的代码组织问题。它允许开发者将逻辑相关的代码组织在一起,提高代码的可读性和可维护性。
-
ref: 用于创建一个响应式的单一值。它返回一个包含值的对象,通过
.value
访问和修改该值。案例:
<template> <div> <p>{{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const count = ref(0); const increment = () => { count.value++; }; return { count, increment }; } }; </script>
在这个例子中,
ref
创建了一个响应式的count
变量,并通过.value
进行更新。 -
reactive: 用于创建一个响应式的对象。它返回一个代理对象,对该对象的任何属性修改都会触发视图更新。
案例:
<template> <div> <p>Name: {{ state.name }}</p> <p>Age: {{ state.age }}</p> <button @click="updateName">Update Name</button> </div> </template> <script> import { reactive } from 'vue'; export default { setup() { const state = reactive({ name: 'John', age: 30 }); const updateName = () => { state.name = 'Jane'; }; return { state, updateName }; } }; </script>
在这个例子中,
reactive
创建了一个响应式的state
对象,修改state.name
会触发视图更新。
3. JavaScript 中的事件循环(Event Loop)是什么?请详细说明宏任务和微任务的区别及案例。
事件循环 是 JavaScript 引擎处理异步操作的核心机制。JavaScript 是单线程的,但它通过事件循环机制实现了非阻塞的异步操作。
-
宏任务(Macro Task): 包括
setTimeout
、setInterval
、I/O
操作、UI 渲染
等。宏任务在事件循环的每个循环周期中执行一次。 -
微任务(Micro Task): 包括
Promise
、MutationObserver
、process.nextTick
(Node.js)等。微任务在当前宏任务执行完毕后立即执行,且在下一个宏任务开始之前执行所有微任务。案例:
console.log('Start'); setTimeout(() => { console.log('setTimeout'); }, 0); Promise.resolve().then(() => { console.log('Promise'); }); console.log('End');
输出顺序:
Start End Promise setTimeout
在这个例子中,
setTimeout
是一个宏任务,Promise
是一个微任务。微任务在宏任务之前执行。
4. TypeScript 中的泛型是什么?请详细说明泛型的使用场景及案例。
泛型 是 TypeScript 中的一种高级类型机制,允许你在定义函数、类或接口时使用类型参数,从而提高代码的复用性和类型安全性。
案例:
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("myString");
console.log(output); // "myString"
let output2 = identity<number>(100);
console.log(output2); // 100
在这个例子中,identity
函数使用了泛型 T
,使得它可以接受任意类型的参数并返回相同类型的值。
5. Webpack 和 Vite 的区别是什么?请详细说明它们的使用场景及案例。
-
Webpack: 是一个功能强大的模块打包工具,支持多种模块规范(如 CommonJS、AMD、ES6 模块等),并且可以通过插件系统扩展功能。Webpack 的配置相对复杂,适合大型项目。
案例:
module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: __dirname + '/dist' }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } } ] } };
-
Vite: 是一个基于 ES 模块的构建工具,利用浏览器原生支持 ES 模块的特性,实现了快速的冷启动和热更新。Vite 的配置相对简单,适合现代前端项目。
案例:
import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; export default defineConfig({ plugins: [vue()] });
6. 前端性能优化有哪些常见手段?请详细说明并给出案例。
-
代码分割(Code Splitting): 通过动态导入(
import()
)将代码分割成多个 chunk,按需加载,减少初始加载时间。案例:
import('./module').then(module => { module.default(); });
-
图片优化: 使用
WebP
格式、懒加载(loading="lazy"
)、雪碧图等技术减少图片加载时间。案例:
<img src="image.webp" loading="lazy" alt="Image">
-
缓存策略: 使用
Service Worker
和Cache API
实现离线缓存,提高页面加载速度。案例:
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js'); }
-
减少重绘和重排(Reflow 和 Repaint): 通过批量修改 DOM、使用
transform
和opacity
属性减少重绘和重排。案例:
.element { transform: translate(10px, 10px); opacity: 0.5; }
7. 前端安全有哪些常见问题?请详细说明并给出案例。
-
XSS(跨站脚本攻击): 攻击者通过注入恶意脚本窃取用户信息。可以通过转义输出、使用
Content Security Policy (CSP)
等手段防御。案例:
const escapeHtml = (str) => { return str.replace(/[&<>"']/g, (m) => { return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[m]; }); }; document.querySelector('#output').innerHTML = escapeHtml(userInput);
-
CSRF(跨站请求伪造): 攻击者通过伪造用户请求执行恶意操作。可以通过使用
CSRF Token
、SameSite Cookie
等手段防御。案例:
const csrfToken = getCookie('csrfToken'); fetch('/api/data', { method: 'POST', headers: { 'X-CSRF-Token': csrfToken } });
-
点击劫持(Clickjacking): 攻击者通过覆盖透明 iframe 诱导用户点击。可以通过设置
X-Frame-Options
头防御。案例:
response.setHeader('X-Frame-Options', 'DENY');
8. 前端测试有哪些常见工具?请详细说明并给出案例。
-
Jest: 一个功能强大的 JavaScript 测试框架,支持快照测试、 mocking、覆盖率报告等。
案例:
test('adds 1 + 2 to equal 3', () => { expect(1 + 2).toBe(3); });
-
Cypress: 一个现代化的端到端测试工具,支持实时重载、调试、网络流量控制等。
案例:
describe('My First Test', () => { it('Does not do much!', () => { expect(true).to.equal(true); }); });
-
Enzyme: 一个 React 组件测试工具,支持 shallow rendering、full rendering、静态渲染等。
案例:
import { shallow } from 'enzyme'; import MyComponent from './MyComponent'; it('renders correctly', () => { const wrapper = shallow(<MyComponent />); expect(wrapper).toMatchSnapshot(); });
9. 前端国际化(i18n)有哪些常见方案?请详细说明并给出案例。
-
i18next: 一个流行的国际化库,支持多种语言、插值、复数、上下文等。
案例:
import i18next from 'i18next'; i18next.init({ lng: 'en', resources: { en: { translation: { welcome: 'Welcome to our website!' } }, fr: { translation: { welcome: 'Bienvenue sur notre site web!' } } } }); console.log(i18next.t('welcome'));
-
React Intl: 一个 React 的国际化库,支持日期、数字、字符串的格式化。
案例:
import { FormattedMessage } from 'react-intl'; function App() { return ( <div> <FormattedMessage id="welcome" defaultMessage="Welcome to our website!" /> </div> ); }
10. 前端监控和错误追踪有哪些常见工具?请详细说明并给出案例。
-
Sentry: 一个错误追踪工具,支持前端和后端,能够自动捕获和报告错误。
案例:
import * as Sentry from '@sentry/browser'; Sentry.init({ dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0' }); try { throw new Error('This is a test error'); } catch (error) { Sentry.captureException(error); }
-
New Relic: 一个性能监控工具,支持前端和后端,能够实时监控应用的性能和错误。
案例:
import newrelic from 'newrelic'; newrelic.noticeError(new Error('This is a test error'));
-
LogRocket: 一个前端监控工具,能够记录用户会话、重现错误、分析性能等。
案例:
import LogRocket from 'logrocket'; LogRocket.init('app/id'); LogRocket.identify('user-id', { name: 'John Doe', email: 'john.doe@example.com' });
总结
2023 年前端高薪面试题涵盖了从基础的 JavaScript、React、Vue 到高级的性能优化、安全、测试、国际化、监控等多个方面。掌握这些知识点不仅能够帮助你在面试中脱颖而出,还能在实际工作中提升代码质量和开发效率。