"# 前端面试题答案
-
如何实现深拷贝? 使用
JSON的方法进行深拷贝:const deepClone = (obj) => { return JSON.parse(JSON.stringify(obj)); };使用递归方法:
const deepClone = (obj) => { if (obj === null || typeof obj !== 'object') return obj; const copy = Array.isArray(obj) ? [] : {}; for (const key in obj) { copy[key] = deepClone(obj[key]); } return copy; }; -
解释事件委托的概念。 事件委托是将事件处理程序添加到父元素,而不是每个子元素上。利用事件冒泡,父元素捕获事件并处理,减少内存使用和提高性能。
-
如何实现防抖和节流? 防抖实现:
function debounce(fn, delay) { let timer; return function (...args) { clearTimeout(timer); timer = setTimeout(() => fn.apply(this, args), delay); }; }节流实现:
function throttle(fn, wait) { let lastTime = 0; return function (...args) { const now = Date.now(); if (now - lastTime >= wait) { lastTime = now; fn.apply(this, args); } }; } -
解释虚拟DOM的原理。 虚拟DOM是一个轻量级的DOM树,通过比较新旧虚拟DOM的差异,使用Diff算法找出变化的部分,只更新需要改动的实际DOM,减少重绘和回流,提高性能。
-
如何处理Promise的并发问题? 使用
Promise.all处理多个Promise并发执行:Promise.all([promise1, promise2]).then(results => { // 处理结果 }); -
解释闭包的概念与应用。 闭包是一个函数和其外部作用域的引用组成的结构。闭包可以用于数据封装和私有变量的实现:
function createCounter() { let count = 0; return { increment: () => ++count, getCount: () => count }; } -
什么是模块化?如何实现? 模块化是将代码分成小的、独立的模块。可以使用ES6模块:
// export.js export const sum = (a, b) => a + b; // import.js import { sum } from './export.js'; -
如何处理跨域问题? 使用CORS(跨源资源共享):
// 服务器端设置 res.setHeader('Access-Control-Allow-Origin', '*');JSONP:
function fetchJsonp(url) { const script = document.createElement('script'); script.src = url + '?callback=handleResponse'; document.body.appendChild(script); } -
解释
this的绑定规则。this的值是在函数被调用时确定的:- 直接调用:
this指向全局对象(在严格模式下为undefined)。 - 方法调用:
this指向调用该方法的对象。 - 构造函数:
this指向新创建的实例。 call、apply、bind:this指向指定的对象。
- 直接调用:
-
如何优化Web性能?
- 使用CDN加速资源加载。
- 图片压缩和懒加载。
- 减少HTTP请求,合并文件。
- 使用Gzip压缩。
-
解释服务端渲染(SSR)与客户端渲染(CSR)的区别。 SSR在服务器上渲染页面并返回HTML,CSR在客户端通过JavaScript生成页面。SSR对SEO友好,首屏加载快;CSR交互更流畅,减少服务器负担。
-
如何使用React Hooks管理状态? 使用
useState和useEffect:import React, { useState, useEffect } from 'react'; const Example = () => { const [count, setCount] = useState(0); useEffect(() => { document.title = `Count: ${count}`; }, [count]); return <button onClick={() => setCount(count + 1)}>Increment</button>; }; -
解释CSS中的浮动和清除浮动。 浮动用于让元素向左或右移动,其他元素围绕它布局。清除浮动可以通过设置
overflow: auto或使用.clearfix类来处理:.clearfix::after { content: ''; display: table; clear: both; } -
什么是WebSocket? WebSocket是一种双向通信协议,允许在客户端和服务器之间实时传输数据。使用
WebSocketAPI创建连接:const socket = new WebSocket('ws://example.com/socket'); socket.onmessage = (event) => { console.log(event.data); }; -
如何实现路由的懒加载? 在React Router中使用
React.lazy和Suspense实现:const LazyComponent = React.lazy(() => import('./LazyComponent')); <Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </Suspense> ```"