哪些JavaScript技巧可以让Web前端代码更高效?_惠州前端培训学校
作者:hz_admin01发布时间:2022-04-22分类:前端开发专业浏览:663
哪些JavaScript技巧可以让Web前端代码更高效?相信学过前端的同学都遇到过这个问题,那么答案是什么呢?接下来一起来看看惠州北大青鸟老师是怎么回答的。
01、async / await
如果你还陷入到回调地狱中,那么你应该回到2014年去开发你的代码。除非绝对必要(像第三方库需要或者性能原因),否则不要使用回调。Promise是非常好的解决回调地狱,但是当你的代码变得越来越大时,它也会变得不太好用。我现在的解决方案就是async / await,它极大提高了代码可读性以及简洁性。
在所有使用Promise的地方你都可以替换成await,在你需要返回Promise对象,简单await它并返回,为了使它不报错,你需要在定义函数的开头添加async。事实上,async / await就是Promise的语法糖。下面就是一个简单的例子:
(async function getData() {
const result = await axios.get('https://dube.io/service/ping')
const data = result.data
console.log('data', data)
return data
}
getData()
await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用。async / await是属于ES2017的内容,所以可能需要babel编译你的代码。不过现在的主流浏览器都已经支持了。
02、异步控制流
经常地,我们会遇到这样的需求,请求获取多个数据集并对每个数据集进行各自处理或者需要等所有异步回调完成后返回一个值。遇到这些情况,我是这么处理的:
for…of
假设我们的页面有多个Pokemon(口袋妖怪),需要获取到它们的详细的信息。我们不想等所有调用结束,特别是不知道它有多少次调用,我们仅想在它有调用返回时就更新我们的数据集。可以用for…of来遍历数组,在代码块里执行async,这样的话,只有每次await执行成功,代码才会继续往下执行。
这里要着重说明,这样做可能会导致性能瓶颈(当请求很多的时候),但像这样做才能到达预期的效果。请看下面的例子:
import axios from 'axios'
let myData = [{id: 0}, {id: 1}, {id: 2}, {id: 3}]
async function fetchData(dataSet) {
for(entry of dataSet) {
const result = await axios.get(`https://ironhack-pokeapi.herokuapp.com/pokemon/${entry.id}`)
const newData = result.data
updateData(newData)
console.log(myData)
}
}
function updateData(newData) {
myData = myData.map(el => {
if(el.id === newData.id) return newData
return el
})
}
fetchData(myData)
这个代码是能正常运行,你可以轻松地复制它到 code sandbox运行。
Promise.all
如果你想同时获取所有口袋妖怪的详情呢?你需要等待所有的请求的完成返回,这时简单使用
Promise.all:
import axios from 'axios'
let myData = [{id: 0}, {id: 1}, {id: 2}, {id: 3}]
async function fetchData(dataSet) {
const pokemonPromises = dataSet.map(entry => {
return axios.get(`https://ironhack-pokeapi.herokuapp.com/pokemon/${entry.id}`)
})
const results = await Promise.all(pokemonPromises)
results.forEach(result => {
updateData(result.data)
})
console.log(myData)
}
function updateData(newData) {
myData = myData.map(el => {
if(el.id === newData.id) return newData
return el
})
}
fetchData(myData)
for...of 和 Promise.all都是ES6以后提出来的,请确保你的环境能运行。
03、解构(Destructuring ) & 默认值
我们接着上面的那个例子,提取一部分代码:
const result = axios.get(`https://ironhack-pokeapi.herokuapp.com/pokemon/${entry.id}`)
const data = result.data
有一种简单的方法,解构从数组,或对象中获取一些属性(值)。像这样:
const { data } = await axios.get(...)
注意当解构的时候,通常要赋给它一个默认值。这样确保你不会得到undefined以及你不用自己手动地检查变量。
const { id = 5 } = {}
console.log(id) // 5
这个技巧也被运用到了函数参数中。例如:
function calculate({operands = [1, 2], type = 'addition'} = {}) {
return operands.reduce((acc, val) => {
switch(type) {
case 'addition':
return acc + val
case 'subtraction':
return acc - val
case 'multiplication':
return acc * val
case 'division':
return acc / val
}
}, ['addition', 'subtraction'].includes(type) ? 0 : 1)
}
console.log(calculate()) // 3
console.log(calculate({type: 'division'})) // 0.5
console.log(calculate({operands: [2, 3, 4], type: 'multiplication'})) // 24
这个例子起初看起来可能有点混乱,但是慢慢观察。当我们没有给函数传递参数的时候,就会使用默认值。一旦我们开始传递参数,仅会使用那些没有传递的参数的默认值。这样,减少了你对异常状态的处理。
04、真值 & 假值
当使用默认值,就可以不用对现有值进行一些额外的检查。但是了解你的变量是真值还是假值是非常棒的。它能提高你的代码扩展性,更具有说服力的以及简洁。我常看到下面一些写法:
if(myBool === true) {
console.log(...)
}
// OR
if(myString.length > 0) {
console.log(...)
}
// OR
if(isNaN(myNumber)) {
console.log(...)
}
为了用这些简洁的判断,你要充分理解js中真值,假值具体有哪些?这里概述一下:
假值:
1.字符串,但长度为0
2.数字0
3.false
4.undefined
5.null
6.NaN
真值
1.空数组
2.空对象
3.其他有值的数据.
注意:在判断真/假值,还应该注意到你使用的是等于'==',还是全等'===',这经常会导致bug。对我而言,经常是数字0。
05、逻辑运算与三元运算符
逻辑运算
逻辑运算是基于多个表达式真假的判断,注意到js是惰性求值的策略。逻辑运算一般返回一个布尔值。&& 和 || 运算符会返回一个指定操作数的值。来看这里:
console.log(true && true) // true
console.log(false && true) // false
console.log(true && false) // false
console.log(false && false) // false
console.log(true || true) // true
console.log(true || false) // true
console.log(false || true) // true
console.log(false || false) // false
进行的逻辑运算,是按照下面的规则进行的:
&&:第一个值为假值,则直接返回;如果为真值,则直接返回第二的值
||:第一个值为真,则直接返回;如果为假,则直接返回第二的值。
console.log(0 && {a: 1}) // 0
console.log(false && 'a') // false
console.log('2' && 5) // 5
console.log([] || false) // []
console.log(NaN || null) // null
console.log(true || 'a') // true
三元运算符
三元运算符和逻辑运算是相似的,但是它有3个部分:
condition ? expr1 : expr2
condition为进行条件判断的部分,将会得到真值或者假值
expr1为条件判断为真时返回的值
expr2为条件判断为假时返回的值
例如:
const
console.log(lang === 'German' ? 'Hallo' : 'Hello') // Hallo
console.log(lang ? 'Ja' : 'Yes') // Ja
console.log(lang === 'French' ? 'Bon soir' : 'Good evening') // Good evening
06、Optional Chaining
过去在 Object 属性链的调用中,很容易因为某个属性不存在而导致之后出现Cannot read property xxx of undefined的错误。为了确认需要向这样处理:
let data
if(myObj && myObj.firstProp && myObj.firstProp.secondProp && myObj.firstProp.secondProp.actualData) data = myObj.firstProp.secondProp.actualData
这样事冗余的,有一个新的提案的方法就是Optional Chaining,如下的形式:
const data = myObj?.firstProp?.secondProp?.actualData
我认为它是检查嵌套属性最佳方法,代码是如此的简洁。
这个特性可以说是非常实用了,不过它现在处于 stage-1 阶段。你可以在.babelrc文件中引入 @babel/plugin-proposal-optional-chaining插件来使用它。
07、Class properties & binding
在JavaScript中函数绑定也是经常的工作任务。现在,大家应该都是用箭头函数自动绑定this到这个类上的(这里可能有歧义,首先箭头函数里面是没有this 和arguments的,这里的this把它当成一个参数就行)。
如果不用箭头函数,我们就需要在构造函数绑定this,当类的方法很多的时候,这就显得很冗余。因此,建议和提倡在类里面用箭头函数。如:
class Counter extends React.Component {
constructor(props) {
super(props)
this.state = { count: 0 }
}
render() {
return(
<div>
<h1>{this.state.count}</h1>
<button onClick={this._increaseCount}>Increase Count</button>
</div>
)
}
_increaseCount = () => {
this.setState({ count: this.state.count + 1 })
}
}
使用箭头函数声明类中方法,它现在处于 stage-3 阶段。你可以在.babelrc文件中引入@babel/plugin-proposal-class-properties插件来使用它。
想了解更多关于前端的资讯,可以来惠州北大青鸟新方舟校区了解一下。
标签:惠州前端培训学校惠州前端基础惠州前端培训北大青鸟IT计算机学校北大青鸟IT软件学校前端北大青鸟IT学校惠州北大青鸟北大青鸟
- 前端开发专业排行
- 标签列表
-
- Java (3694)
- 北大青鸟 (3713)
- 软件开发 (3613)
- JAVA (3413)
- UI设计入门 (2093)
- 惠州北大青鸟 (4375)
- 惠州IT培训 (2558)
- UI设计培训 (2090)
- 惠州UI设计培训 (2095)
- 惠州UI设计培训学校 (2090)
- 惠州计算机软件培训 (6260)
- 惠州计算件软件开发 (6260)
- 惠州计算机软件基础 (6261)
- 惠州计算机JAVA培训 (3574)
- 惠州计算机Java软件开发 (3620)
- 惠州计算机JAVA软件开发 (4645)
- 惠州计算机JAVA软件开发学校 (3338)
- 惠州计算机Java软件开发培训 (3338)
- 北大青鸟IT计算机学校 (5048)
- 北大青鸟IT软件学校 (5062)
- 北大青鸟IT学校 (5059)
- 惠州计算机UI设计软件开发 (2088)
- UI设计基础教程 (2088)
- UI设计是什么 (2088)
- UI设计教程 (2088)
- 网站分类
-
- 计算机教程
- 计算机入门
- 职业学校
- 新闻动态
- 专业课程
- 热门技术
- SEO
- 培训教程
- windows
- linux教程
- 系统集成
- 网站开发
- Html5
- 办公软件
- 师资力量
- 热点问答
- 联系我们
- 计算机学校
- 惠州计算机学校
- 河源计算机学校
- 广州计算机学校
- 深圳计算机学校
- 湛江计算机学校
- 佛山计算机学校
- IT计算机培训信息
- 设计专业
- UI
- 影视特效
- 游戏动漫设计
- Photoshop
- AI设计
- 软件教程
- Java技术
- C语言/C++语言培训
- C#
- Python技术
- PHP
- 数据库
- SQL Server
- 网络教程
- 网络安全
- 网络营销
- 软件专业
- 大数据专业
- 前端开发专业
- 软件测试专业
- Python专业
- 软件实施
- 珠海计算机学校
- 初中生学什么好
- 计算机认证
- 文章归档
-
- 2024年12月 (15)
- 2024年11月 (45)
- 2024年10月 (32)
- 2024年9月 (29)
- 2024年8月 (68)
- 2024年7月 (59)
- 2024年6月 (43)
- 2024年5月 (48)
- 2024年4月 (80)
- 2024年3月 (65)
- 2024年2月 (54)
- 2024年1月 (25)
- 2023年12月 (12)
- 2023年11月 (73)
- 2023年10月 (134)
- 2023年9月 (34)
- 2023年8月 (3)
- 2023年7月 (3)
- 2023年6月 (12)
- 2023年5月 (30)
- 2023年4月 (72)
- 2023年3月 (11)
- 2023年2月 (34)
- 2023年1月 (37)
- 2022年12月 (78)
- 2022年11月 (359)
- 2022年6月 (1193)
- 2022年5月 (570)
- 2022年4月 (1567)
- 2022年3月 (982)
- 2022年2月 (54)
- 2022年1月 (182)
- 2021年9月 (308)
- 2021年8月 (1704)
- 2021年7月 (2423)
- 2021年6月 (1806)
- 2021年5月 (1569)
- 2021年4月 (1380)
- 2021年3月 (1255)
- 2021年2月 (709)
- 2021年1月 (1521)
- 2020年12月 (3626)
- 2020年11月 (1646)
- 2020年10月 (1046)
- 2020年9月 (592)
- 最近发表
-
- 东莞信息:2024年长安镇技能创业咖啡节成功举办|||广州计算机软件培训
- 河源信息:本周六百企万岗职等你来市县镇联动大型招聘活动即将开幕!|||计算机培训学校招生
- 茂名信息:茂名组织劳动人事仲裁案件庭审观摩活动|||大学生计算机培训学校
- 茂名信息:茂名市人力资源和社会保障局相继开展诚信宣传四进主题实践活动|||广州市北大青鸟计算机职业培训学校
- 茂名信息:凝心聚力共筑平安茂名市人力资源和社会保障局开展平安建设暨一感两度宣传活动|||大学生计算机培训学校
- 汕头信息:汕头市人力资源和社会保障局开展宪法宣传周活动|||北大青鸟计算机培训中心
- 梅州信息:梅州市人社局开展2024年第四季度诚信文化主题宣传志愿服务活动|||电脑计算机编程培训学校
- 东莞信息:塘厦人社分局联合消防大队开展技工学校等机构消防安全培训|||广州计算机软件培训
- 东莞信息:塘厦塘厦镇成功举办优才服务区第二期业务提升培训班|||计算机软件培训学校
- 东莞信息:2024年横沥镇举办模具设计师职业技能大赛|||广州计算机软件培训