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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
JavaScript優(yōu)化技巧

 作為開(kāi)發(fā)人員,我們一直在尋找讓我們的代碼更快更好的方法。但在此之前,編寫(xiě)高性能代碼需要做三件事:

  • 了解語(yǔ)言及其工作原理
  • 基于用例進(jìn)行設(shè)計(jì)
  • 調(diào)試!修復(fù)!重復(fù)

記住這一點(diǎn)

任何傻瓜都可以編寫(xiě)計(jì)算機(jī)可以理解的代碼,優(yōu)秀的程序員編寫(xiě)人類(lèi)可以理解的代碼。- 丁·福勒

我們來(lái)看看如何使 JavaScript代碼運(yùn)行得更快。

延遲

延遲算法將計(jì)算延遲到需要執(zhí)行時(shí)才執(zhí)行,然后生成結(jié)果。

 
 
 
 
  1. const someFn = () => { 
  2.   doSomeOperation() 
  3.   return () => { 
  4.     doExpensiveOperation() 
  5.   } 
  6.  
  7. const t = someArray.filter((x) => checkSomeCondition(x)).map((x) => someFn(x)) 
  8.  
  9. // 現(xiàn)在,如果有需要在執(zhí)行 
  10. t.map((x) => t()) 

最快的代碼是未執(zhí)行的代碼,所以盡量延遲執(zhí)行。

JavaScript 使用原型繼承,JS 中所有對(duì)象都是Object的實(shí)例。

MDN說(shuō):

嘗試訪問(wèn)對(duì)象的屬性時(shí),不僅會(huì)在對(duì)象上搜索該屬性,還會(huì)在對(duì)象的原型,原型的原型等上搜索該屬性,直到找到匹配屬性名或原型鏈的末端。

對(duì)于每個(gè)屬性,JavaScript引擎都必須遍歷整個(gè)對(duì)象鏈,直到找到匹配項(xiàng)。如果使用不當(dāng),這會(huì)占用大量資源,并影響應(yīng)用程序的性能。

所以不要這樣:

 
 
 
 
  1. const name = userResponse.data.user.firstname + userResponse.data.user.lastname 

而是這樣做:

 
 
 
 
  1. const user = userResponse.data.user 
  2. const name = user.firstname + user.lastname 

使用臨時(shí)變量來(lái)保存鏈接的屬性,而不是遍歷訪問(wèn)整條鏈。

使用轉(zhuǎn)譯器之前要三思

在上述情況下,userResponse可能不是對(duì)象,如果是對(duì)象,它的屬性 user 也可能不是對(duì)象。所以,在獲取值時(shí)要進(jìn)行檢查:

 
 
 
 
  1. let name = '' 
  2. if (userResponse) { 
  3.   const data = userResponse.data 
  4.   if (data && data.user) { 
  5.     const user = data.user 
  6.     if (user.firstname) { 
  7.       name += user.firstname 
  8.     } 
  9.     if (user.lastname) { 
  10.       name += user.firstname 
  11.     } 
  12.   } 

這太啰嗦了。代碼越多,bug 就越明顯。我們能把它縮小嗎?當(dāng)然,可以使用 JS 中可選的鏈接、解構(gòu)賦值來(lái)優(yōu)化它。

 
 
 
 
  1. const user = userResponse?.data?.user 
  2. const { firstname = '', lastname = ''} = user 
  3. const name = firstname + lastname 

是不是很靈活地,簡(jiǎn)短?不要使用這個(gè)要注意,Babel 會(huì)按照以下方式進(jìn)行轉(zhuǎn)換:

 
 
 
 
  1. 'use strict' 
  2.  
  3. var _userResponse, _userResponse$data 
  4.  
  5. var user = 
  6.   (_userResponse = userResponse) === null || _userResponse === void 0 
  7.     ? void 0 
  8.     : (_userResponse$data = _userResponse.data) === null || 
  9.       _userResponse$data === void 0 
  10.     ? void 0 
  11.     : _userResponse$data.user 
  12. var _user$firstname = user.firstname, 
  13.   firstname = _user$firstname === void 0 ? '' : _user$firstname, 
  14.   _user$lastname = user.lastname, 
  15.   lastname = _user$lastname === void 0 ? '' : _user$lastname 
  16. var name = firstname + lastname 

當(dāng)使用轉(zhuǎn)譯時(shí),確保你選擇了一個(gè)更適合你的用例的。

了解SMI和堆號(hào)

數(shù)字很奇怪,ECMAScript將數(shù)字標(biāo)準(zhǔn)化為64位浮點(diǎn)值,也稱(chēng)為雙精度浮點(diǎn)或Float64表示形式。

如果 JS 引擎以Float64表示形式存儲(chǔ)數(shù)字,則將導(dǎo)致巨大的性能低下。JS 引擎對(duì)數(shù)字進(jìn)行抽象,使其行為與Float64完全匹配。與float64運(yùn)算相比,JS 引擎執(zhí)行整數(shù)運(yùn)算的速度要快得多。

有時(shí),我們認(rèn)為像下面這樣寫(xiě)法可讀比較好:

 
 
 
 
  1. const maxWidth = '1000' 
  2. const minWidth = '100' 
  3. const margin = '10' 
  4. getWidth = () => ({ 
  5.   maxWidth: maxWidth - margin * 2, 
  6.   minWidth: minWidth - margin * 2, 
  7. }) 

評(píng)估局部變量

如果getWidth函數(shù)被多次調(diào)用,那么每次調(diào)用它時(shí)都會(huì)計(jì)算它的值。上面的計(jì)算并不是什么大問(wèn)題,因此我們不會(huì)注意到任何性能影響。

但是總的來(lái)說(shuō),運(yùn)行時(shí)的求值的數(shù)量越少,性能就越好。

 
 
 
 
  1. // maxWidth - (margin * 2) 
  2. const maxWidth = '980' 
  3. // minWidth - (margin * 2) 
  4. const minWidth = '80' 
  5. const margin = '10' 
  6. getWidth = () => ({ 
  7.   maxWidth, 
  8.   minWidth, 
  9. }) 

使用 Map 而不是 switch/if-else 條件

如果要檢查多個(gè)條件時(shí),可以使用Map代替 switch/if-else條件。在Map中查找元素的性能比對(duì)switch和if-else條件快得多。

 
 
 
 
  1. switch (day) { 
  2.   case 'monday': 
  3.     return 'workday' 
  4.   case 'tuesday': 
  5.     return 'workday' 
  6.   case 'wednesday': 
  7.     return 'workday' 
  8.   case 'thursday': 
  9.     return 'workday' 
  10.   case 'friday': 
  11.     return 'workday' 
  12.   case 'saturday': 
  13.     return 'funday' 
  14.   case 'sunday': 
  15.     return 'funday' 
  16.  
  17. // or this 
  18.  
  19. if ( 
  20.   day === 'monday' || 
  21.   day === 'tuesday' || 
  22.   day === 'wednesday' || 
  23.   day === 'thursday' || 
  24.   day === 'friday' 
  25.   return 'workday' 
  26. else return 'funday' 

上面可以使用 Map 來(lái)代替

 
 
 
 
  1. const m = new Map([ 
  2.     ['monday','workday'], 
  3.     ['tuesday', 'workday'], 
  4.     ['wednesday', 'workday'], 
  5.     ['thursday', 'workday'], 
  6.     ['friday', 'workday'], 
  7.     ['saturday', 'funday'], 
  8.     ['sunday', 'funday'] 
  9. ]; 
  10.  
  11. return m.get(day); 

if-else 排序

在 React組件中,這種寫(xiě)法還是很常見(jiàn)的。

 
 
 
 
  1. export default function UserList(props) { 
  2.   const { users } = props 
  3.  
  4.   if (users.length) { 
  5.     return  
  6.   } 
  7.  
  8.   return  

在這里,我們?cè)跊](méi)有用戶時(shí)渲染 否則渲染 。有大部分人認(rèn)為,我們首先處理所有空的的情況,然后再處理有數(shù)據(jù)的情況。對(duì)于任何讀過(guò)它的人來(lái)說(shuō)都更清楚,而且效率更高。也就是說(shuō),以下代碼比上一個(gè)代碼更有效。

 
 
 
 
  1. export default function UserList(props) { 
  2.   const { users } = props 
  3.  
  4.   if (!users.length) { 
  5.     return  
  6.   } 
  7.  
  8.   // some resource intensive operation 
  9.   return  

當(dāng)然 users.length 一直有值的話,就使用第一種情況。

類(lèi)型是你最好的朋友

JavaScript是解釋型和編譯型語(yǔ)言。為了產(chǎn)生更有效的二進(jìn)制文件,編譯器需要類(lèi)型信息。但是,作為一種動(dòng)態(tài)類(lèi)型化的語(yǔ)言會(huì)使編譯器難以進(jìn)行。

編譯器在編譯熱代碼(多次執(zhí)行的代碼)時(shí)進(jìn)行一些假設(shè)并優(yōu)化代碼。編譯器花費(fèi)一些時(shí)間來(lái)生成此優(yōu)化的代碼。當(dāng)這些假設(shè)失敗時(shí),編譯器必須丟棄優(yōu)化的代碼,并退回到解釋的執(zhí)行方式。這是耗時(shí)且昂貴的。

作者:EthicalAds 譯者:前端小智 來(lái)源: sendilkumarn

原文:https://sendilkumarn.com/blog/javascript-optimization/

本文轉(zhuǎn)載自微信公眾號(hào)「 大遷世界 」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。


網(wǎng)頁(yè)名稱(chēng):JavaScript優(yōu)化技巧
文章路徑:http://m.5511xx.com/article/cdhcodd.html