JS性能优化高频面试题及详细答案(实战向)_第1页
JS性能优化高频面试题及详细答案(实战向)_第2页
JS性能优化高频面试题及详细答案(实战向)_第3页
JS性能优化高频面试题及详细答案(实战向)_第4页
JS性能优化高频面试题及详细答案(实战向)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JS性能优化高频面试题及详细答案(实战向)1、说说你对JavaScript性能优化的整体理解,日常开发主要从哪些维度做优化?参考答案:JS性能优化核心就一个目标:减少阻塞、加快执行、降低资源消耗、提升页面响应速度。日常开发主要从五大维度落地:1.代码执行优化:减少冗余计算、避免重复遍历、优化循环逻辑、合理使用数据结构;2.DOM操作优化:DOM操作是前端最耗性能的操作,重点减少重排重绘、减少DOM查询次数;3.内存优化:避免内存泄漏、及时释放引用、减少无用变量占用;4.异步与任务调度优化:避免主线程阻塞、拆分长任务、合理使用宏微任务;5.加载与打包优化:代码压缩、按需加载、懒加载、减少首屏JS体积。所有优化都遵循一个原则:首屏优先、交互优先、主线程优先,非必要逻辑延迟执行。2、为什么说DOM操作昂贵?如何批量优化DOM操作?参考答案:DOM是浏览器的跨线程接口,JS引擎和DOM渲染引擎是独立线程,每次读写DOM都会产生线程通信开销,同时频繁修改DOM会触发浏览器的重排、重绘,这是前端性能卡顿的核心原因之一。批量优化DOM的常用手段:1.缓存DOM节点:不要在循环里频繁执行document.getElementById、querySelector,提前把节点获取后存入变量,复用变量;2.文档碎片批量插入:大量新增DOM时,创建DocumentFragment,先把所有节点挂载到碎片中,最后一次性插入页面,只触发一次DOM更新;3.脱离DOM流修改:复杂节点修改前先设置display:none,修改完成后再恢复显示,中间的多次修改不会触发重排;4.合并样式修改:不要逐行修改style属性,统一修改className,或者一次性赋值style对象;5.避免循环读写DOM:循环中分开做「读操作」和「写操作」,先批量读数据,再批量改DOM,避免浏览器频繁刷新队列。3、讲讲重排(回流)和重绘的区别,以及对应的优化方案参考答案:重绘:修改元素的颜色、背景、透明度等不影响布局的样式,浏览器只重新绘制像素,不计算布局,开销较小。重排(回流):修改元素的宽高、位置、边距、字体大小等影响页面布局的属性,浏览器需要重新计算整个页面的几何布局,开销极大,且一个元素重排可能引发父级、子级、同级元素连锁重排。优化手段:1.优先使用重绘属性,尽量避免频繁改动布局属性;2.集中修改样式,避免逐行修改;3.开启硬件加速,通过transform、opacity做动画,这两个属性不会触发重排,只触发合成层渲染;4.减少频繁获取布局属性(offsetWidth、scrollTop等),这类属性会强制浏览器刷新渲染队列,引发强制重排。4、JS循环有哪些优化点?为什么for循环比forEach性能更好?参考答案:循环核心优化点:1.缓存数组长度,避免每次循环都读取length属性;2.循环内部不做DOM查询、不做复杂计算,提前把外部依赖数据缓存;3.减少循环嵌套,多层嵌套时间复杂度会成倍增加;4.合理终止循环,满足条件及时break/return,避免无效遍历。for优于forEach的原因:1.for循环是底层原生语法,没有额外函数调用开销;forEach是数组原型方法,每次遍历都会执行一次回调函数,产生执行上下文、参数传递等开销;2.forEach无法中断遍历,只能遍历全部元素,for循环可通过break终止;3.大数据量遍历场景下,for循环的执行效率、内存占用都远优于forEach。补充:遍历性能排序大致为:for>while>forEach>for...in,for...in最慢,因为会遍历原型链属性,适合遍历对象,不适合遍历数组。5、什么是长任务?如何解决JS主线程阻塞问题?参考答案:JS是单线程语言,主线程同时只能执行一个任务。执行时间超过50ms的任务就属于长任务,长任务会阻塞渲染、阻塞用户交互,造成页面卡顿、点击无响应。解决方案:1.任务拆分:把耗时的循环、计算逻辑拆分成多个小任务,利用setTimeout、requestIdleCallback、Promise微任务拆分执行;2.使用WebWorker:纯计算、数据处理、解析类耗时任务,放到Worker子线程执行,不占用主线程,计算完成后再把结果传回主线程;3.延迟非核心逻辑:首屏渲染、用户交互优先,日志上报、数据统计、次要渲染逻辑延迟到页面空闲后执行;4.避免同步阻塞代码:杜绝大量同步循环、同步文件读取、同步正则匹配等耗时操作。6、讲讲JS内存泄漏的常见场景和排查、优化方式参考答案:内存泄漏本质:无用数据没有被GC回收,程序不再使用的变量、对象依然占用内存,导致内存持续升高,页面卡顿、崩溃。常见泄漏场景:1.全局变量过多:未声明的变量会挂载到window,页面不销毁就一直存在;2.定时器/监听未清除:setInterval、addEventListener、scroll/resize监听,组件销毁、页面跳转时未清空,持续绑定执行;3.闭包滥用:闭包持续引用外层变量,导致变量无法被GC回收;4.DOM引用未释放:JS缓存了DOM节点,节点从页面移除后,变量仍持有引用;5.缓存无限累加:自定义缓存对象、Map、数组持续push数据,没有过期、清空机制。优化与排查:1.尽量使用局部变量,避免全局变量,必要时手动置空变量;2.组件销毁、页面卸载时,清除所有定时器、事件监听;3.合理使用WeakMap、WeakSet,弱引用不阻碍GC回收;4.通过ChromePerformance、Memory面板,查看内存走势图、快照,定位泄漏对象。7、WeakMap/WeakSet为什么能优化内存?和Map/Set的区别?参考答案:核心区别在于引用类型:Map、Set是强引用,WeakMap、WeakSet是弱引用。当一个对象只被WeakMap/WeakSet引用时,没有其他强引用,GC会自动回收该对象,不会造成内存堆积;而Map/Set的强引用会阻止GC回收,只要数据存在,内存就一直占用。性能优化场景:1.存储DOM节点的自定义数据,节点删除后内存自动释放;2.缓存临时对象数据,无需手动清空,减少内存泄漏风险;3.记录对象状态、组件实例信息,适配动态销毁的场景。补充:Weak系列不支持遍历、没有size属性,只能用于存储映射关系,不能做数据遍历存储。8、防抖和节流的原理、区别,以及实际性能优化场景参考答案:防抖和节流是解决高频触发事件导致性能卡顿的核心方案,比如输入、滚动、窗口缩放、鼠标移动等高频事件。防抖:触发事件后,延迟一段时间执行,如果期间再次触发,重置延迟时间,只执行最后一次。适用场景:输入框搜索、表单输入联想、窗口缩放结束后更新布局。节流:固定时间内只执行一次,稀释执行频率,不管触发多少次,单位时间内仅执行一次。适用场景:页面滚动监听、鼠标拖拽、按钮频繁点击、页面滚动加载。优化价值:大幅减少函数执行次数,避免高频DOM操作、接口请求造成的页面卡顿和资源浪费。9、前端代码打包和加载层面,有哪些JS性能优化手段?参考答案:1.代码压缩混淆:删除空格、注释、缩短变量名,减小JS文件体积,提升下载速度;2.Tree-Shaking:打包时剔除未使用的冗余代码、死代码,减少打包体积(仅支持ES6模块);3.按需加载/动态导入:使用import()动态导入模块,路由、组件、功能模块按需加载,减少首屏JS体积;4.分包策略:将第三方库、公共代码、业务代码拆分打包,利用浏览器缓存,第三方库变更少,可长期缓存;5.懒加载:非首屏组件、图片、弹窗、二级页面逻辑,延迟加载;6.开启Gzip压缩:服务端开启Gzip,大幅减小传输文件大小,提升加载速度。10、说说你对渲染合成层的理解,如何利用合成层优化动画性能?参考答案:浏览器渲染流程:解析HTML&CSS→生成布局树→布局计算(重排)→绘制像素(重绘)→图层合成。合成层是浏览器将页面拆分成多个独立图层,单独渲染、最后合并展示。独立合成层的修改,不会触发重排重绘,只触发图层合成,性能极高。优化方式:1.动画优先使用transform、opacity属性,这两个属性走合成层,无重排重绘;2.避免使用top、left、width、height做动画,会持续触发重排,极易卡顿;3.对需要频繁动画的元素,通过will-change:transform提前告知浏览器,开启硬件加速,提升渲染流畅度;4.合理控制合成层数量,过多合成层会占用GPU内存,反而导致性能下降。11、异步代码有哪些优化点?如何避免异步地狱?参考答案:异步优化点:1.优先使用Promise、async/await替代嵌套回调,减少回调地狱,代码可读性和执行效率更高;2.并行异步任务用Promise.all,串行任务用顺序await,避免无效等待;3.避免无意义的微任务嵌套,过多微任务会阻塞渲染;4.接口请求做缓存、防抖,避免重复请求浪费资源。避免异步地狱:核心就是摒弃多层嵌套回调,统一使用async/await扁平化写法,复杂异步逻辑拆分封装成独立函数,拆分任务、解耦代码,让异步逻辑线性执行,结构清晰且性能更好。12、大数据量渲染(长列表)卡顿,有哪些JS优化方案?参考答案:长列表卡顿核心原因:一次性渲染上千DOM节点,造成大量重排重绘、DOM节点过多占用内存、主线程阻塞。主流优化方案:1.虚拟列表(核心方案

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论