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 f i r s t n a m e = = = v o i d 0 ? ′ ′ : u s e r firstname === void 0 ? '' : _user firstname===void0?′′:userfirstname,

_user$lastname = user.lastname,

lastname = _user l a s t n a m e = = = v o i d 0 ? ′ ′ : u s e r lastname === void 0 ? '' : _user lastname===void0?′′:userlastname

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’

文末

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。

个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

第二阶段:移动端开发技术

第三阶段:前端常用框架

  • 推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;

  • 大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值