日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
9個JavaScript小技巧:寫出更簡潔,高效代碼

JavaScript一直在變化進(jìn)步著,這兒列舉了一些小技巧幫你在2019年寫出更簡潔,高效的可拓展的代碼。下面共列舉了9個講究使用的小技巧來幫助你成為更好的開發(fā)者。

創(chuàng)新互聯(lián)建站專注于龍沙企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城系統(tǒng)網(wǎng)站開發(fā)。龍沙網(wǎng)站建設(shè)公司,為龍沙等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

1. async / await

如果你還陷入到回調(diào)地獄中,那么你應(yīng)該回到2014年去開發(fā)你的代碼。除非絕對必要(像第三方庫需要或者性能原因),否則不要使用回調(diào)。Promise是非常好的解決回調(diào)地獄,但是當(dāng)你的代碼變得越來越大時,它也會變得不太好用。我現(xiàn)在的解決方案就是async / await,它極大提高了代碼可讀性以及簡潔性。在所有使用Promise的地方你都可以替換成await,在你需要返回Promise對象,簡單await它并返回,為了使它不報錯,你需要在定義函數(shù)的開頭添加async。事實上,async / await就是Promise的語法糖。下面就是一個簡單的例子:

 
 
 
  1. async function getData() { 
  2.  const result = await axios.get('https://dube.io/service/ping') 
  3.  const data = result.data 
  4.   
  5.  console.log('data', data) 
  6.   
  7.  return data 
  8. getData() 

await 操作符用于等待一個Promise 對象。它只能在異步函數(shù) async function 中使用。 async / await是屬于ES2017的內(nèi)容,所以可能需要babel編譯你的代碼。不過現(xiàn)在的主流瀏覽器都已經(jīng)支持了。

2. 異步控制流

經(jīng)常地,我們會遇到這樣的需求,請求獲取多個數(shù)據(jù)集并對每個數(shù)據(jù)集進(jìn)行各自處理或者需要等所有異步回調(diào)完成后返回一個值。遇到這些情況,我是這么處理的:

for…of

假設(shè)我們的頁面有多個Pokemon(口袋妖怪),需要獲取到它們的詳細(xì)的信息。我們不想等所有調(diào)用結(jié)束,特別是不知道它有多少次調(diào)用,我們僅想在它有調(diào)用返回時就更新我們的數(shù)據(jù)集。可以用for…of來遍歷數(shù)組,在代碼塊里執(zhí)行async,這樣的話,只有每次await執(zhí)行成功,代碼才會繼續(xù)往下執(zhí)行。

這里要著重說明,這樣做可能會導(dǎo)致性能瓶頸(當(dāng)請求很多的時候),但像這樣做才能到達(dá)預(yù)期的效果。請看下面的例子:

 
 
 
  1. import axios from 'axios' 
  2. let myData = [{id: 0}, {id: 1}, {id: 2}, {id: 3}] 
  3. async function fetchData(dataSet) { 
  4.  for(entry of dataSet) { 
  5.  const result = await axios.get(`https://ironhack-pokeapi.herokuapp.com/pokemon/${entry.id}`) 
  6.  const newData = result.data 
  7.  updateData(newData) 
  8.   
  9.  console.log(myData) 
  10.  } 
  11. function updateData(newData) { 
  12.  myData = myData.map(el => { 
  13.  if(el.id === newData.id) return newData 
  14.  return el 
  15.  }) 

fetchData(myData)

這個代碼是能正常運行,你可以輕松地復(fù)制它到 code sandbox運行。

 
 
 
  1. Promise.all 

如果你想同時獲取所有口袋妖怪的詳情呢?你需要等待所有的請求的完成返回,這時簡單使用Promise.all:

 
 
 
  1. import axios from 'axios'  
  2. let myData = [{id: 0}, {id: 1}, {id: 2}, {id: 3}] 
  3. async function fetchData(dataSet) { 
  4.  const pokemonPromises = dataSet.map(entry => { 
  5.  return axios.get(`https://ironhack-pokeapi.herokuapp.com/pokemon/${entry.id}`) 
  6.  }) 
  7.  const results = await Promise.all(pokemonPromises) 
  8.   
  9.  results.forEach(result => { 
  10.  updateData(result.data) 
  11.  }) 
  12.   
  13.  console.log(myData)  
  14. function updateData(newData) { 
  15.  myData = myData.map(el => { 
  16.  if(el.id === newData.id) return newData 
  17.  return el 
  18.  }) 
  19.   
  20. fetchData(myData) 

for...of 和 Promise.all都是ES6以后提出來的,請確保你的環(huán)境能運行。

3. 解構(gòu)(Destructuring ) & 默認(rèn)值

我們接著上面的那個例子,提取一部分代碼:

 
 
 
  1. const result = axios.get(`https://ironhack-pokeapi.herokuapp.com/pokemon/${entry.id}`) 
  2. const data = result.data 

有一種簡單的方法,解構(gòu)從數(shù)組,或?qū)ο笾蝎@取一些屬性(值)。像這樣:

const { data } = await axios.get(...)

注意當(dāng)解構(gòu)的時候,通常要賦給它一個默認(rèn)值。這樣確保你不會得到undefined以及你不用自己手動地檢查變量。

 
 
 
  1. const { id = 5 } = {} 
  2. console.log(id) // 5 

這個技巧也被運用到了函數(shù)參數(shù)中。例如:

 
 
 
  1. function calculate({operands = [1, 2], type = 'addition'} = {}) { 
  2.  return operands.reduce((acc, val) => { 
  3.  switch(type) { 
  4.  case 'addition': 
  5.  return acc + val 
  6.  case 'subtraction': 
  7.  return acc - val 
  8.  case 'multiplication': 
  9.  return acc * val 
  10.  case 'division': 
  11.  return acc / val 
  12.  } 
  13.  }, ['addition', 'subtraction'].includes(type) ? 0 : 1) 
  14. console.log(calculate()) // 3 
  15. console.log(calculate({type: 'division'})) // 0.5 
  16. console.log(calculate({operands: [2, 3, 4], type: 'multiplication'})) // 24 

這個例子起初看起來可能有點混亂,但是慢慢觀察。當(dāng)我們沒有給函數(shù)傳遞參數(shù)的時候,就會使用默認(rèn)值。一旦我們開始傳遞參數(shù),僅會使用那些沒有傳遞的參數(shù)的默認(rèn)值。這樣,減少了你對異常狀態(tài)的處理。

4. 真值 & 假值

當(dāng)使用默認(rèn)值,就可以不用對現(xiàn)有值進(jìn)行一些額外的檢查。但是了解你的變量是真值還是假值是非常棒的。它能提高你的代碼擴展性,更具有說服力的以及簡潔。我??吹较旅嬉恍懛ǎ?/p>

 
 
 
  1. if(myBool === true) { 
  2.  console.log(...) 
  3. // OR 
  4. if(myString.length > 0) { 
  5.  console.log(...) 
  6. // OR 
  7. if(isNaN(myNumber)) { 
  8.  console.log(...) 

為了用這些簡潔的判斷,你要充分理解js中真值,假值具體有哪些?這里概述一下:

假值:

1.字符串,但長度為0

2.數(shù)字0

3.false

4.undefined

5.null

6.NaN

真值:

1.空數(shù)組

2.空對象

3.其他有值的數(shù)據(jù).注意:在判斷真/假值,還應(yīng)該注意到你使用的是等于'==',還是全等'===',這經(jīng)常會導(dǎo)致bug。對我而言,經(jīng)常是數(shù)字0。

邏輯運算與三元運算符

邏輯運算

邏輯運算是基于多個表達(dá)式真假的判斷,注意到j(luò)s是惰性求值的策略。邏輯運算一般返回一個布爾值。&& 和 || 運算符會返回一個指定操作數(shù)的值。來看這里:

 
 
 
  1. console.log(true && true) // true 
  2. console.log(false && true) // false 
  3. console.log(true && false) // false 
  4. console.log(false && false) // false 
  5. console.log(true || true) // true 
  6. console.log(true || false) // true 
  7. console.log(false || true) // true 
  8. console.log(false || false) // false 

進(jìn)行的邏輯運算,是按照下面的規(guī)則進(jìn)行的:

  • &&:第一個值為假值,則直接返回;如果為真值,則直接返回第二的值
  • ||:第一個值為真,則直接返回;如果為假,則直接返回第二的值。

console.log(0 && {a: 1}) // 0console.log(false && 'a') // falseconsole.log('2' && 5) // 5console.log([] || false) // []console.log(NaN || null) // nullconsole.log(true || 'a') // true

三元運算符

三元運算符和邏輯運算是相似的,但是它有3個部分:

condition ? expr1 : expr2

condition為進(jìn)行條件判斷的部分,將會得到真值或者假值

expr1為條件判斷為真時返回的值

expr2為條件判斷為假時返回的值

例如:

 
 
 
  1. const lang = 'German' 
  2. console.log(lang === 'German' ? 'Hallo' : 'Hello') // Hallo 
  3. console.log(lang ? 'Ja' : 'Yes') // Ja 
  4. console.log(lang === 'French' ? 'Bon soir' : 'Good evening') // Good evening 

6. Optional Chaining

過去在 Object 屬性鏈的調(diào)用中,很容易因為某個屬性不存在而導(dǎo)致之后出現(xiàn)Cannot read property xxx of undefined的錯誤。為了確認(rèn)需要向這樣處理:

 
 
 
  1. let data 
  2. if(myObj && myObj.firstProp && myObj.firstProp.secondProp && myObj.firstProp.secondProp.actualData) data = myObj.firstProp.secondProp.actualData 

這樣是冗余的,有一個新的提案的方法就是Optional Chaining,如下的形式:

 
 
 
  1. const data = myObj?.firstProp?.secondProp?.actualData 

我認(rèn)為它是檢查嵌套屬性最佳方法,代碼是如此的簡潔。

這個特性可以說是非常實用了,不過它現(xiàn)在處于 stage-1 階段。你可以在.babelrc文件中引入 @babel/plugin-proposal-optional-chaining插件來使用它。

7. Class properties & binding

在JavaScript中函數(shù)綁定也是經(jīng)常的工作任務(wù)?,F(xiàn)在,大家應(yīng)該都是用箭頭函數(shù)自動綁定this到這個類上的(這里可能有歧義,首先箭頭函數(shù)里面是沒有this 和arguments的,這里的this把它當(dāng)成一個參數(shù)就行)。如果不用箭頭函數(shù),我們就需要在構(gòu)造函數(shù)綁定this,當(dāng)類的方法很多的時候,這就顯得很冗余。因此,建議和提倡在類里面用箭頭函數(shù)。如:

 
 
 
  1. class Counter extends React.Component { 
  2.  constructor(props) { 
  3.  super(props) 
  4.  this.state = { count: 0 } 
  5.  } 
  6.   
  7.  render() { 
  8.  return( 
  9.  
     
  10.  

    {this.state.count}

      
  11.  Increase Count 
  12.  
 
  •  ) 
  •  } 
  •   
  •  _increaseCount = () => { 
  •  this.setState({ count: this.state.count + 1 }) 
  •  } 
  • 使用箭頭函數(shù)聲明類中方法,它現(xiàn)在處于 stage-3 階段。你可以在.babelrc文件中引入@babel/plugin-proposal-class-properties插件來使用它。

    8.使用parcel

    作為一個前端,你也肯定會遇到打包和編譯代碼情況。似乎webpack成為標(biāo)準(zhǔn)已經(jīng)很長時間了。我從webpack 1版本就開始使用它了,當(dāng)然那是痛苦的。為了弄懂它所有的配置項,我花了無數(shù)的時間才讓它正常打包和編譯。如果還有選擇的機會,我是不會學(xué)習(xí)webpack的。恰巧幾個月前用了parcel,從來沒有發(fā)現(xiàn)配置可以如此簡單!你不需要改動什么便能得到你預(yù)期的效果,當(dāng)然你也可以修改配置項。它也是和webpack或babel一樣是可配置的,同時也是快速的。如果你不知道parcel,我明確建議你去學(xué)習(xí)它!

    當(dāng)然,現(xiàn)在的主流標(biāo)準(zhǔn)還是webpack,webpack 4之后配置也簡潔了,可以在學(xué)習(xí)parcel之后了解webpack,不說了,又要開始學(xué)習(xí)webpack 5。

    9. 寫更多你自己的代碼

    談到這個話題,我有很多想要分享討論的東西。對于css,許多人更傾向于使用第三方組件庫像bootstrap。對于JavaScript,我也看到很多人喜歡用jQuery以及一些小型的驗證,滾動的庫等等。雖然使用庫是方便的,但是我強烈建議你能自己實現(xiàn)它,而不是盲目的安裝npm包。當(dāng)它變成一個很大的庫或者框架的時候,整個團隊都要構(gòu)建它,像moment.js或者react-datepicker,而且當(dāng)需求發(fā)生改變時,你想要改動它是困難的。所以,你應(yīng)該寫更多自己的組件。這將會帶來三個重要的優(yōu)點:

    • 你很清楚你的代碼發(fā)生了什么
    • 同時,在你自己動手實現(xiàn)的過程中,你也能真正開始明白何為編程,以及庫中代碼是怎么運行的
    • 你能阻止你的代碼變得臃腫

    在開始,使用npm包是方便的。你能花更多時間去實現(xiàn)自己的業(yè)務(wù)邏輯。但當(dāng)那個包沒有按照預(yù)期運行時,你又換了一個包,這時不得不花更多時間去讀它的API才能使用它。當(dāng)是你自己實現(xiàn)的庫(組件)時,你能百分百用自己的用例來定制化開發(fā)它。

    總結(jié)

    文中提到的點其實都是基礎(chǔ),但實用的。對于新手JavaScript開發(fā)者,其實我更建議應(yīng)該開始學(xué)習(xí)typescript了。因為它實在太好了!


    本文名稱:9個JavaScript小技巧:寫出更簡潔,高效代碼
    標(biāo)題網(wǎng)址:http://www.5511xx.com/article/djssgij.html