2021-01-19 22:44:30
2025年Web前端面试高频问题及答案整理如下,涵盖核心知识点与项目场景应用:
一、JavaScript相关如何判断用户设备?
使用 navigator.userAgent 检测浏览器类型,结合正则匹配设备关键词(如 Android、iPhone)。
现代方案推荐使用 User-Agent Client Hints API(需浏览器支持)或响应式设计优先适配。
navigator.sendBeacon 方法的作用?
用于在页面卸载时(如关闭标签页)异步发送小量数据(如埋点日志)到服务器,避免阻塞页面卸载。
示例:
window.addEventListener('beforeunload', () => { navigator.sendBeacon('/log', JSON.stringify({ event: 'page_exit' }));});如何实现大文件切片上传?
切片数量考量因素:文件大小、网络带宽、服务器并发处理能力。
关键步骤:
使用 File.slice() 分割文件。
通过 FormData 逐片上传,携带切片索引和文件唯一标识。
服务器合并切片并返回结果。
如何判断对象是否为空(包括原型链)?
使用 Object.getOwnPropertyNames(obj).length === 0 或 JSON.stringify(obj) === '{}'(无法检测原型链)。
完整方案:
function isEmpty(obj) { return Object.keys(obj).length === 0 && obj.constructor === Object;}JS执行100万个任务如何避免卡顿?
使用 时间切片(Time Slicing) 或 requestIdleCallback 将任务拆分为小块,在浏览器空闲时执行。
示例:
function chunkTasks(tasks, callback) { let index = 0; function execute() { if (index < tasks.length) { tasks[index++](); requestIdleCallback(execute); } else callback(); } execute();}如何统计页面Long Task(长任务)?
使用 PerformanceObserver 监听 longtask 类型:
const observer = new PerformanceObserver((list) => { list.getEntries().forEach((entry) => { console.log('Long Task:', entry.duration); });});observer.observe({ entryTypes: ['longtask'] });如何实现虚拟滚动加载?
原理:仅渲染可视区域内的列表项,通过监听滚动事件动态调整渲染范围。
关键点:计算可视区域高度、列表项偏移量,使用绝对定位或CSS transform 模拟滚动。
如何减少项目中的 if-else?
使用 策略模式 或 状晌亮态模式 替代条件分支。
示例:
const strategies = { typeA: (data) => data * 2, typeB: (data) => data + 10,};function execute(type, data) { return strategies[type]?.(data) || 'Invalid type';}React循环渲染中为何不推荐用 index 作为 key?
key 用于标识列表项的唯一性,使用 index 会导致组件状态错乱(宴蠢宽如排序或过滤后)。
正确做法:使用唯一ID(如数据库ID)档链作为 key。
Vue中 Scoped Styles 如何实现样式隔离?
通过给组件根元素添加唯一属性(如 data-v-f3f3eg9),并将样式选择器转换为属性选择器(如 .button[data-v-f3f3eg9])。
React如何避免 context 引起全局重渲染?
将 context 拆分为多个独立上下文,或使用 React.memo 包裹子组件避免不必要的更新。
浏览器同源策略下,CDN为何无跨域限制?
CDN返回的资源通常不包含敏感信息(如HTML、JS、CSS),且通过 CORS(跨域资源共享) 头部(如 Access-Control-Allow-Origin: *)显式允许跨域访问。
如何实现跨页面通信?
BroadcastChannel API:同一域名下的标签页间通信。
LocalStorage/SessionStorage:监听 storage 事件。
SharedWorker:多标签页共享的Web Worker。
HTTP如何保持用户登录态?
通过 Cookie(设置 HttpOnly 和 Secure)或 Token(如JWT)在请求头中携带身份信息。
服务器验证后返回新数据,维持会话状态。
Webpack中 sideEffects 属性的作用?
标记模块是否有副作用(如修改全局变量),帮助Webpack进行 Tree Shaking 优化,移除未使用的代码。
如何设计前端日志埋点SDK?
关键点:
数据采集:记录用户行为、错误信息、性能数据。
数据上报:使用 sendBeacon 或 Image 对象避免阻塞。
隐私合规:支持匿名化处理和用户授权。
Git中如何定位引入错误的commit?
使用 git bisect 二分查找:
git bisect startgit bisect bad HEAD # 当前版本有错误git bisect good v1.0 # 已知正确版本git bisect run test_script.sh # 自动测试脚本如何防止XSS攻击?
对用户输入进行转义(如使用 textContent 替代 innerHTML)。
设置 CSP(内容安全策略) 头部限制脚本来源。
使用 HttpOnly Cookie 防止JS访问敏感信息。
移动端H5适配方案?
视口设置:<meta name="viewport" content="width=device-width, initial-scale=1">。
REM布局:通过JS动态计算根字体大小,配合媒体查询。
Flexbox/Grid:使用弹性布局适配不同屏幕。
如何实现网页加载进度条?
监听 PerformanceNavigationTiming 或使用 NProgress 库模拟进度。
结合资源加载事件(如 Promise.all 等待关键资源)。
微前端为何不常用iframe隔离?
缺点:iframe与父页面通信复杂、URL同步困难、性能开销大。
替代方案:Qiankun等库通过JS沙箱和样式隔离实现应用级隔离。
完整题库与详细答案参考: