作为开发人员,我们一直在寻找让我们的代码更快更好的方法。但在此之前,编写高性能代码需要做三件事:

记住这一点
任何傻瓜都可以编写计算机可以理解的代码,优秀的程序员编写人类可以理解的代码。- 丁·福勒
我们来看看如何使 JavaScript代码运行得更快。
延迟
延迟算法将计算延迟到需要执行时才执行,然后生成结果。
- const someFn = () => {
 - doSomeOperation()
 - return () => {
 - doExpensiveOperation()
 - }
 - }
 - const t = someArray.filter((x) => checkSomeCondition(x)).map((x) => someFn(x))
 - // 现在,如果有需要在执行
 - t.map((x) => t())
 
最快的代码是未执行的代码,所以尽量延迟执行。
JavaScript 使用原型继承,JS 中所有对象都是Object的实例。
MDN说:
尝试访问对象的属性时,不仅会在对象上搜索该属性,还会在对象的原型,原型的原型等上搜索该属性,直到找到匹配属性名或原型链的末端。
对于每个属性,JavaScript引擎都必须遍历整个对象链,直到找到匹配项。如果使用不当,这会占用大量资源,并影响应用程序的性能。
所以不要这样:
- const name = userResponse.data.user.firstname + userResponse.data.user.lastname
 
而是这样做:
- const user = userResponse.data.user
 - const name = user.firstname + user.lastname
 
使用临时变量来保存链接的属性,而不是遍历访问整条链。
使用转译器之前要三思
在上述情况下,userResponse可能不是对象,如果是对象,它的属性 user 也可能不是对象。所以,在获取值时要进行检查:
- let name = ''
 - if (userResponse) {
 - const data = userResponse.data
 - if (data && data.user) {
 - const user = data.user
 - if (user.firstname) {
 - name += user.firstname
 - }
 - if (user.lastname) {
 - name += user.firstname
 - }
 - }
 - }
 
这太啰嗦了。代码越多,bug 就越明显。我们能把它缩小吗?当然,可以使用 JS 中可选的链接、解构赋值来优化它。
- const user = userResponse?.data?.user
 - const { firstname = '', lastname = ''} = user
 - const name = firstname + lastname
 
是不是很灵活地,简短?不要使用这个要注意,Babel 会按照以下方式进行转换:
- 'use strict'
 - var _userResponse, _userResponse$data
 - var user =
 - (_userResponse = userResponse) === null || _userResponse === void 0
 - ? void 0
 - : (_userResponse$data = _userResponse.data) === null ||
 - _userResponse$data === void 0
 - ? void 0
 - : _userResponse$data.user
 - var _user$firstname = user.firstname,
 - firstname = _user$firstname === void 0 ? '' : _user$firstname,
 - _user$lastname = user.lastname,
 - lastname = _user$lastname === void 0 ? '' : _user$lastname
 - var name = firstname + lastname
 
当使用转译时,确保你选择了一个更适合你的用例的。
了解SMI和堆号
数字很奇怪,ECMAScript将数字标准化为64位浮点值,也称为双精度浮点或Float64表示形式。
如果 JS 引擎以Float64表示形式存储数字,则将导致巨大的性能低下。JS 引擎对数字进行抽象,使其行为与Float64完全匹配。与float64运算相比,JS 引擎执行整数运算的速度要快得多。
有时,我们认为像下面这样写法可读比较好:
- const maxWidth = '1000'
 - const minWidth = '100'
 - const margin = '10'
 - getWidth = () => ({
 - maxWidth: maxWidth - margin * 2,
 - minWidth: minWidth - margin * 2,
 - })
 
评估局部变量
如果getWidth函数被多次调用,那么每次调用它时都会计算它的值。上面的计算并不是什么大问题,因此我们不会注意到任何性能影响。
但是总的来说,运行时的求值的数量越少,性能就越好。
- // maxWidth - (margin * 2)
 - const maxWidth = '980'
 - // minWidth - (margin * 2)
 - const minWidth = '80'
 - const margin = '10'
 - getWidth = () => ({
 - maxWidth,
 - minWidth,
 - })
 
使用 Map 而不是 switch/if-else 条件
如果要检查多个条件时,可以使用Map代替 switch/if-else条件。在Map中查找元素的性能比对switch和if-else条件快得多。
- switch (day) {
 - case 'monday':
 - return 'workday'
 - case 'tuesday':
 - return 'workday'
 - case 'wednesday':
 - return 'workday'
 - case 'thursday':
 - return 'workday'
 - case 'friday':
 - return 'workday'
 - case 'saturday':
 - return 'funday'
 - case 'sunday':
 - return 'funday'
 - }
 - // or this
 - if (
 - day === 'monday' ||
 - day === 'tuesday' ||
 - day === 'wednesday' ||
 - day === 'thursday' ||
 - day === 'friday'
 - )
 - return 'workday'
 - else return 'funday'
 
上面可以使用 Map 来代替
- const m = new Map([
 - ['monday','workday'],
 - ['tuesday', 'workday'],
 - ['wednesday', 'workday'],
 - ['thursday', 'workday'],
 - ['friday', 'workday'],
 - ['saturday', 'funday'],
 - ['sunday', 'funday']
 - ];
 - return m.get(day);
 
if-else 排序
在 React组件中,这种写法还是很常见的。
- export default function UserList(props) {
 - const { users } = props
 - if (users.length) {
 - return
 - }
 - return
 - }
 
在这里,我们在没有用户时渲染 否则渲染 。有大部分人认为,我们首先处理所有空的的情况,然后再处理有数据的情况。对于任何读过它的人来说都更清楚,而且效率更高。也就是说,以下代码比上一个代码更有效。
- export default function UserList(props) {
 - const { users } = props
 - if (!users.length) {
 - return
 - }
 - // some resource intensive operation
 - return
 - }
 
当然 users.length 一直有值的话,就使用第一种情况。
类型是你最好的朋友
JavaScript是解释型和编译型语言。为了产生更有效的二进制文件,编译器需要类型信息。但是,作为一种动态类型化的语言会使编译器难以进行。
编译器在编译热代码(多次执行的代码)时进行一些假设并优化代码。编译器花费一些时间来生成此优化的代码。当这些假设失败时,编译器必须丢弃优化的代码,并退回到解释的执行方式。这是耗时且昂贵的。
作者:EthicalAds 译者:前端小智 来源: sendilkumarn
原文:https://sendilkumarn.com/blog/javascript-optimization/
本文转载自微信公众号「 大迁世界 」,可以通过以下二维码关注。转载本文请联系大迁世界公众号。
                文章标题:JavaScript优化技巧
                
                转载来源:http://www.csdahua.cn/qtweb/news5/440855.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网