Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

What are the optimization techniques of JavaScript

2025-01-18 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/03 Report--

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 } return }

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

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

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

类型是你最好的朋友

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

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

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

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report