本文主要针对一些 JavaScript 进行优化,使之更加健壮,可读性更强,更以维护。,缺点:代码太长了,维护和阅读都很不友好,includes 是 ES7 新增的 API,与 indexOf 不同的是 includes 直接返回的是 Boolean 值,indexOf 则 返回的索引值, 数组和字符串都有 includes 方法。,需求:我们来实现一个身份认证方法,通过传入身份 Id 返回对应的验证结果,传统方法,includes 优化,在 JavaScript 中,我们可以使用 for(), while(), for(in),for(of)几种循环,事实上,这三种循环中 for(in) 的效率极差,因为他需要查询散列键,所以应该尽量少用。,for 循环是最传统的语句,它以变量 i 作为索引,以跟踪访问的位置,对数组进行操作。,以上的方法有一个问题:就是当数组的长度到达百万级时,arr.length 就要计算一百万次,这是相当耗性能的。所以可以采用以下方法就行改良。,此时 arr.length 只需要计算一次,优化了性能。,for-in 一般用来来遍历对象的属性的,不过属性需要 enumerable(可枚举)才能被读取到。同时 for-in 也可以遍历数组,遍历数组的时候遍历的是数组的下标值。,for-of 语句看着有点像 for-in 语句,但是和 for-of 语句不同的是它不可以循环对象,只能循环数组。,for-of 比 for-in 循环遍历数组更好。for-of 只要具有 Iterator 接口的数据结构,都可以使用它迭代成员。它直接读取的是键值。for-in 需要穷举对象的所有属性,包括自定义的添加的属性也能遍历到。且 for-in 的 key 是 String 类型,有转换过程,开销比较大。,所以在开发过程中循环数组尽量避免使用 for-in。,数组去重是实际开发处理数据中经常遇到的,方法有很多,这里就不一一例举了。,1、最传统的方法:利用数组的 indexOf 下标属性来查询。,2、优化:利用 ES6 的 Set 方法。,Set 本身是一个构造函数,用来生成 Set 数据结构。Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。Set 对象允许你存储任何类型的值,无论是原始值或者是对象引用。它类似于数组,但是成员的值都是唯一的,没有重复的值。,箭头函数表达式的语法比函数表达式更简洁。所以在开发中更推荐使用箭头函数。特别是在 vue 项目中,使用箭头函数不需要在更 this 重新赋一个变量。,要注意的是,箭头函数不绑定 arguments,取而代之用 rest 参数…解决。,创建多个 dom 元素时,先将元素 append 到 DocumentFragment 中,最后统一将 DocumentFragment 添加到页面。,常规方法;,使用 DocumentFragment 优化多次 append,更优的方法:使用一次 innerHTML 赋值代替构建 dom 元素,系统进程不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。当内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。,引起内存泄漏的原因,1、未声明变量或者使用 this 创建的变量(this 的指向是 window)都会引起内存泄漏,解决方法:,2、在 vue 单页面应用,声明的全局变量在切换页面的时候没有清空,解决方案: 在页面卸载的时候顺便处理掉该引用。,闭包引起的内存泄漏原因:闭包可以维持函数内局部变量,使其得不到释放。,解决:将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中,删除对 dom 的引用。,由于项目中有些页面难免会碰到需要定时器或者事件监听。但是在离开当前页面的时候,定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况,这个时就需要清除定时器事件监听,即在页面卸载(关闭)的生命周期函数里,清除定时器。,在前端开发的过程中,我们经常会需要绑定一些持续触发的事件,如 resize、scroll、mousemove 等等,但有些时候我们并不希望在事件持续触发的过程中那么频繁地去执行函数。这时候就用到防抖与节流。,案例 1:远程搜索时需要通过接口动态的获取数据,若是每次用户输入都接口请求,是浪费带宽和性能的。,案例 2:持续触发 scroll 事件时,并不立即执行 handle 函数,当 1000 毫秒内没有触发 scroll 事件时,才会延时触发一次 handle 函数。,默认情况下,浏览器是同步加载 js 脚本,解析 html 过程中,遇到 <script> 标签就会停下来,等脚本下载、解析、执行完后,再继续向下解析渲染。,如果 js 文件体积比较大,下载时间就会很长,容易造成浏览器堵塞,浏览器页面会呈现出“白屏”效果,用户会感觉浏览器“卡死了”,没有响应。此时,我们可以让 js 脚本异步加载、执行。,上面代码中,<script> 标签分别有 defer 和 async 属性,浏览器识别到这 2 个属性时 js 就会异步加载。也就是说,浏览器不会等待这个脚本下载、执行完毕后再向后执行,而是直接继续向后执行。,defer 与 async 区别:
© 版权声明
文章版权归作者所有,未经允许请勿转载。