文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript优化技巧都有哪些

2024-04-02 19:55

关注

JavaScript优化技巧都有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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

记住这一点

任何傻瓜都可以编写计算机可以理解的代码,优秀的程序员编写人类可以理解的代码。

我们来看看如何使 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 <UserList />   }    return <EmptyUserList /> }

在这里,我们在没有用户时渲染否则渲染。有大部分人认为,我们首先处理所有空的的情况,然后再处理有数据的情况。对于任何读过它的人来说都更清楚,而且效率更高。也就是说,以下代码比上一个代码更有效。

export default function UserList(props) {   const { users } = props    if (!users.length) {     return <EmptyUserList />   }    // some resource intensive operation   return <UserList /> }

当然 users.length 一直有值的话,就使用第一种情况。

类型是你最好的朋友

JavaScript是解释型和编译型语言。为了产生更有效的二进制文件,编译器需要类型信息。但是,作为一种动态类型化的语言会使编译器难以进行。

编译器在编译热代码(多次执行的代码)时进行一些假设并优化代码。编译器花费一些时间来生成此优化的代码。当这些假设失败时,编译器必须丢弃优化的代码,并退回到解释的执行方式。这是耗时且昂贵的。

看完上述内容,你们掌握JavaScript优化技巧都有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯