面试题答案
一键面试1. 优化策略
- 浏览器环境:
- 减少重排和重绘:频繁的DOM操作会触发重排和重绘,尽量批量操作DOM,例如使用DocumentFragment。
- 合理使用定时器:避免设置过小的
setTimeout
或setInterval
时间间隔,防止任务堆积。 - 避免长时间同步任务:长时间运行的同步代码会阻塞事件循环,可将复杂计算分解为多个微任务或宏任务。
- Node.js环境:
- 优化I/O操作:利用Node.js的异步I/O特性,合理使用
fs
模块的异步方法,避免阻塞事件循环。 - 控制并发数量:对于高并发的I/O操作,使用
async
库或Promise.allSettled
等方法控制并发数量,防止资源耗尽。 - 使用集群模块:对于CPU密集型任务,可使用
cluster
模块利用多核CPU,提高性能。
- 优化I/O操作:利用Node.js的异步I/O特性,合理使用
2. 实现差异
- 任务队列类型:
- 浏览器:有宏任务队列(如
setTimeout
、setInterval
、requestAnimationFrame
等产生的任务)和微任务队列(如Promise.then
、MutationObserver
等产生的任务)。 - Node.js:在不同版本略有差异,总体上也有宏任务队列(如
setTimeout
、setInterval
、setImmediate
等)和微任务队列(如process.nextTick
、Promise.then
等),但process.nextTick
的优先级高于其他微任务。
- 浏览器:有宏任务队列(如
- 事件循环机制:
- 浏览器:事件循环基于HTML标准,一次循环中处理一个宏任务,然后处理完所有微任务,再进行下一次循环。
- Node.js:事件循环分为6个阶段,依次为
timers
(处理setTimeout
和setInterval
)、I/O callbacks
(处理大部分I/O回调)、idle, prepare
(系统内部使用)、poll
(获取新的I/O事件等)、check
(执行setImmediate
)、close callbacks
(处理关闭的回调,如socket.on('close', ...)
)。每个阶段会处理该阶段特定类型的任务。
3. 针对性优化
- 浏览器环境:
- 高并发场景:使用
Web Workers
进行多线程处理,将一些计算密集型任务放到Web Workers
线程中执行,避免阻塞主线程的事件循环。例如,在进行复杂数据处理时,创建一个Web Worker
实例,通过postMessage
与主线程通信。 - 低延迟场景:合理利用
requestAnimationFrame
,对于动画相关任务,它会在浏览器下一次重绘之前执行,保证动画流畅且延迟较低。同时,减少微任务和宏任务的嵌套深度,确保任务能及时执行。
- 高并发场景:使用
- Node.js环境:
- 高并发场景:利用
async/await
结合Promise
进行异步流程控制,例如在处理多个并发的数据库查询时,使用Promise.all
将多个查询任务并行执行,并且通过async/await
使代码看起来更同步,便于维护。 - 低延迟场景:对于I/O操作,优先使用基于事件驱动的非阻塞I/O。如在处理HTTP请求时,使用
http
模块的事件监听机制,快速响应请求,减少请求处理的延迟。同时,合理利用process.nextTick
来处理一些需要在当前操作完成后立即执行的任务,但要注意避免过度使用导致事件循环阻塞。
- 高并发场景:利用