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
当使用转译时,确保你选择了一个更适合你的用例的。
===================================================================
数字很奇怪,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,
})
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
Vue 编码基础
2.1.1. 组件规范
2.1.2. 模板中使用简单的表达式
2.1.3 指令都使用缩写形式
2.1.4 标签顺序保持一致
2.1.5 必须为 v-for 设置键值 key
2.1.6 v-show 与 v-if 选择
2.1.7 script 标签内部结构顺序
2.1.8 Vue Router 规范
Vue 项目目录规范
2.2.1 基础
2.2.2 使用 Vue-cli 脚手架
2.2.3 目录说明
2.2.4注释说明
2.2.5 其他
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
4 标签顺序保持一致
2.1.5 必须为 v-for 设置键值 key
2.1.6 v-show 与 v-if 选择
2.1.7 script 标签内部结构顺序
2.1.8 Vue Router 规范
Vue 项目目录规范
2.2.1 基础
2.2.2 使用 Vue-cli 脚手架
2.2.3 目录说明
2.2.4注释说明
2.2.5 其他
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】