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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
提高程序代碼質(zhì)量的七大JavaScript優(yōu)秀實踐

自2015年以來,隨著ECMAScript 6(簡稱ES6)的發(fā)布,每年都有新版本的ECMAScript規(guī)范面市。而每次迭代都為該語言添加新的功能、新的語法、以及新的質(zhì)量改進。為此,大多數(shù)瀏覽器和Node.js中的JavaScript引擎都需要迎頭趕上。就連程序員的編程習(xí)慣、以及代碼組織方法,也需要與時俱進,以提高整體的代碼質(zhì)量,并方便后期的維護。

發(fā)展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務(wù)至上”的服務(wù)理念,堅持“二合一”的優(yōu)良服務(wù)模式,真誠服務(wù)每家企業(yè),認真做好每個細節(jié),不斷完善自我,成就企業(yè),實現(xiàn)共贏。行業(yè)涉及成都邊坡防護網(wǎng)等,在網(wǎng)站建設(shè)公司成都營銷網(wǎng)站建設(shè)、WAP手機網(wǎng)站、VI設(shè)計、軟件開發(fā)等項目上具有豐富的設(shè)計經(jīng)驗。

為了便于您編寫出更簡潔、更易讀的程序代碼,本文將在總結(jié)和歸納ECMAScript最新功能的基礎(chǔ)上,為您提供提高JavaScript和Node.js代碼質(zhì)量的七種優(yōu)秀實踐。

1.塊作用域聲明(Block Scoped Declarations)

自從該語言問世以來,JavaScript開發(fā)人員一直使用var來聲明變量。不過,正如下面代碼段所展示的那樣,由關(guān)鍵字var所創(chuàng)建的變量,在其作用域上會出現(xiàn)問題。

 
 
 
  1. var x = 10 
  2. if (true) { 
  3.   var x = 15     // inner declaration overrides declaration in parent scope 
  4.   console.log(x) // prints 15 
  5. console.log(x)   // prints 15 

由于已定義的變量var并非塊作用域(block-scoped),因此如果在小作用域內(nèi)被重新定義,它們就會影響到外部作用域的值。

然而,如果我們用let和const兩個新的關(guān)鍵字來替換var,便可以避免該缺陷(請參見如下代碼段)。

 
 
 
  1. let y = 10 
  2. if (true) { 
  3.   let y = 15       // inner declaration is scoped within the if block 
  4.   console.log(y)   // prints 15 
  5. console.log(y)     // prints 10 

當(dāng)然,const與let在語義上有所不同,那些用const聲明的變量,無法在其作用域內(nèi)被重新分配(如下代碼段所示)。不過,這并不意味著它們是不可改變的,而只是代表著它們的引用不能被更改。

 
 
 
  1. const x = [] 
  2.   
  3. x.push("Hello", "World!") 
  4. x // ["Hello", "World!"] 
  5.   
  6. x = [] // TypeError: Attempted to assign to readonly property. 

2.箭頭函數(shù)(Arrow Functions)

作為新近被引入JavaScript的一項重要功能,箭頭函數(shù)具有許多優(yōu)點。首先,它們能夠讓JavaScript的函數(shù)看起來更加整潔,并且更便于開發(fā)者的編寫。

 
 
 
  1. let x = [1, 2, 3, 4] 
  2.   
  3. x.map(val => val * 2)                // [2, 4, 6, 8] 
  4. x.filter(val => val % 2 == 0)        // [2, 4] 
  5. x.reduce((acc, val) => acc + val, 0) // 10 

如上述示例所示,“=>”后面的函數(shù)以一種簡潔的語法,替換了傳統(tǒng)函數(shù)。

  • 如果函數(shù)主體是單個表達式,則已經(jīng)隱含了作用域括號{}和return關(guān)鍵字,所以無需額外寫入。
  • 如果函數(shù)只有一個參數(shù),則也已經(jīng)隱含了參數(shù)括號(),同樣無需額外寫入。
  • 如果函數(shù)體的表達式是一套字典(dictionary),則必須將其括入括號()中。

箭頭函數(shù)的另一個優(yōu)勢在于:為了避免由于使用this關(guān)鍵字,而引起的諸多不便,箭頭函數(shù)并不會定義作用域,而是會存在于其父作用域中。也就是說,箭頭函數(shù)沒有任何針對this的綁定。在箭頭函數(shù)中,this的值與父作用域中的值是相同的。因此,箭頭函數(shù)不能被用作各種方法或構(gòu)造函數(shù)。它們既不適用于apply、bind或call,也沒有針對super的綁定。

此外,箭頭函數(shù)還會受到諸如:缺少可供傳統(tǒng)功能訪問的arguments對象,以及缺少函數(shù)體中的yield等其他限制。

可以說,箭頭函數(shù)并非是與標(biāo)準(zhǔn)函數(shù)的1:1替代,而是向JavaScript中添加了額外的功能集。

3.可選鏈(Optional Chaining)

讓我們來試想一個類似person對象的、具有深層嵌套的數(shù)據(jù)結(jié)構(gòu)。業(yè)務(wù)應(yīng)用需要訪問到該對象的名字和姓氏。由此,我們可以編寫出如下JavaScript代碼:

 
 
 
  1. public class HelloWorld { 
  2.     public static void main(String[] args) { 
  3.         System.out.println("Hello World"); 
  4.     } 

然而,如果person對象并不包含嵌套的name對象,則可能會出現(xiàn)如下錯誤。

 
 
 
  1. person = { 
  2.   age: 42 
  3. person.name.first // TypeError: Cannot read property 'first' of undefined 
  4. person.name.last  // TypeError: Cannot read property 'last' of undefined 

對此,開發(fā)人員往往需要通過如下代碼,來予以解決。顯然,這些代碼不但冗長難寫,而且可讀性較差。

 
 
 
  1. person && person.name && person.name.first // undefined 

而作為JavaScript的一項新功能,可選鏈的語法允許您訪問嵌套得更深的對象屬性,而不用擔(dān)心屬性是否真的存在。也就是說,如果可選鏈在挖掘過程遇到了null或undefined的值,那么就會通過短路(short-circuit)計算,返回undefined,而不會報錯。

 
 
 
  1. person?.name?.first // undefined 

如上述代碼所示,其結(jié)果代碼簡潔且明了。

4.空值合并(Null-ish Coalescing)

在引入空值合并運算符之前,在輸入為空的情況下,JavaScript開發(fā)人員需要使用OR運算符--||,以回退到默認值。這就會導(dǎo)致:即使出現(xiàn)合法的、但屬于虛假值(falsy values),也會被回退到默認值的情況。

 
 
 
  1. function print(val) { 
  2.     return val || 'Missing' 
  3.   
  4. print(undefined) // 'Missing' 
  5. print(null)      // 'Missing' 
  6.   
  7. print(0)         // 'Missing' 
  8. print('')        // 'Missing' 
  9. print(false)     // 'Missing' 
  10. print(NaN)       // 'Missing' 

如今,JavaScript推出了null合并運算符--??。它能夠保證只有在前面的表達式為null-ish的情況下,才會觸發(fā)回退。值得注意的是,此處的空值是指null或undefined。

 
 
 
  1. function print(val) { 
  2.     return val ?? 'Missing' 
  3.   
  4. print(undefined) // 'Missing' 
  5. print(null)      // 'Missing' 
  6.   
  7. print(0)         // 0 
  8. print('')        // '' 
  9. print(false)     // false 
  10. print(NaN)       // NaN 

如此,您可以確保自己的程序能夠接受虛假值作為合法輸入,而不會最終被回退。

5.邏輯賦值(Logical Assignment)

假設(shè)您需要先判斷是否為空,再為變量分配數(shù)值,那么如下代碼便展示了這樣的基本邏輯:

 
 
 
  1. if (x === null || x == undefined) { 
  2.     x = y 

如果您熟悉上面提到的短路計算的工作原理,則可能會使用null-ish合并運算符(coalescing operator),將上述三行代碼替換為如下更簡潔的版本。

 
 
 
  1. x ?? (x = y) // x = y if x is nullish, else no effect 

由上述代碼可知,如果x為null-ish的話,我們可以使用null-ish合并運算符的短路功能,來執(zhí)行第二部分(x = y)。這段代碼雖然非常簡潔,但是不太容易被閱讀或理解。而我們完全可以使用如下代碼,根據(jù)邏輯上的null-ish分配,來消除此類變通方法。

 
 
 
  1. x ??= y // x = y if x is nullish, else no effect 

同樣,JavaScript還引入了邏輯AND賦值--&&=、邏輯OR賦值--||=的運算符。這些運算符僅在滿足特定條件時被執(zhí)行賦值,否則并不起作用。

 
 
 
  1. x ||= y // x = y if x is falsy, else no effect 
  2. x &&= y // x = y if x is truthy, else no effect 

專家建議:如果您有過Ruby的編程經(jīng)驗,那么您會一眼識別出||=和&&=運算符。畢竟Ruby并沒有虛假值的概念。

6.已命名捕獲組(Named Capture Groups)

不知您是否知曉正則表達式中的“捕獲組”的相關(guān)概念?如下面的代碼段所示,它是與括號中的正則表達式部分匹配的字符串。

 
 
 
  1. let re = /(\d{4})-(\d{2})-(\d{2})/ 
  2. let result = re.exec('Pi day this year falls on 2021-03-14!') 
  3.   
  4. result[0] // '2020-03-14', the complete match 
  5. result[1] // '2020', the first capture group 
  6. result[2] // '03', the second capture group 
  7. result[3] // '14', the third capture group 

一直以來,正則表達式都能夠支持已命名捕獲組。這是一種通過引用名稱、而非索引,來捕獲各個組的方式。目前,在ES9中,該功能已被JavaScript實現(xiàn)。正如下面的代碼段所示,其結(jié)果對象包含了一個嵌套的組對象,其中每個捕獲組的值都能夠映射到其名稱上。

 
 
 
  1. let re = /(?\d{4})-(?\d{2})-(?\d{2})/ 
  2. let result = re.exec('Pi day this year falls on 2021-03-14!') 
  3.   
  4. result.groups.year  // '2020', the group named 'year' 
  5. result.groups.month // '03', the group named 'month' 
  6. result.groups.day   // '14', the group named 'day' 

而且,新的API與JavaScript的解構(gòu)分配功能,也能夠完美地結(jié)合在一起(請參見下面的代碼段)。

 
 
 
  1. let re = /(?\d{4})-(?\d{2})-(?\d{2})/ 
  2. let result = re.exec('Pi day this year falls on 2021-03-14!') 
  3. let { year, month, day } = result.groups 
  4.   
  5. year  // '2020' 
  6. month // '03' 
  7. day   // '14' 

7.async和await

眾所周知,異步性是JavaScript的一項強大功能。許多可能長時間運行、或較為耗時的函數(shù),能夠返回Promise,而不會被阻止運行。

 
 
 
  1. const url = 'https://the-one-api.dev/v2/book' 
  2. let prom = fetch(url) 
  3. prom // Promise {
  4.   
  5. // wait a bit 
  6. prom // Promise {: Response}, if no errors 
  7. // or 
  8. prom // Promise {: Error message}, if any error 

在上述代碼段中,針對fetch的調(diào)用返回了一個狀態(tài)為“待處理(pending)”的Promise。而當(dāng)API返回響應(yīng)時,它將會轉(zhuǎn)換為“已實現(xiàn)(fulfilled)”的狀態(tài)。在Promises中,您可以執(zhí)行如下操作,來通過API的調(diào)用,將響應(yīng)解析成為JSON。

 
 
 
  1. const url = 'https://the-one-api.dev/v2/book' 
  2. let prom = fetch(url) 
  3. prom                               // Promise {: Response} 
  4.   .then(res => res.json()) 
  5.   .then(json => console.log(json)) // prints response, if no errors 
  6.   .catch(err => console.log(err))  // prints error message, if any error 

2017年,JavaScript推出了兩個新的關(guān)鍵字async和await,來使得Promises的處理和使用變得更加容易和流暢。當(dāng)然,它們并非Promises的替代,只是Promises概念之上的語法增強。

而且,并非讓所有的代碼里都出現(xiàn)在一系列的“then”函數(shù),await旨在讓其更像同步的JavaScript。您可以使用帶有await的try...catch,來代替直接使用Promise的catch函數(shù)去處理錯誤。下面是具有同等效果的await代碼。

 
 
 
  1. const url = 'https://the-one-api.dev/v2/book' 
  2. let res = await fetch(url) // Promise {: Response} -await-> Response 
  3. try { 
  4.     let json = await res.json() 
  5.     console.log(json) // prints response, if no errors 
  6. } catch(err) { 
  7.   console.log(err)  // prints error message, if any error 

當(dāng)然,async關(guān)鍵字也有著“硬幣的另一面”,它會將任何待發(fā)送的數(shù)據(jù)封裝到一個Promise中。下面是一段旨在通過異步函數(shù)添加多個數(shù)字的程序代碼。在現(xiàn)實情況中,您的代碼可能會比它更加復(fù)雜。

 
 
 
  1. async function sum(...nums) { 
  2.     return nums.reduce((agg, val) => agg + val, 0) 
  3. sum(1, 2, 3)                    // Promise {: 6} 
  4.   .then(res => console.log(res) // prints 6 
  5. let res = await sum(1, 2, 3)    // Promise {: 6} -await-> 6 
  6. console.log(res)                // prints 6 

小結(jié)

如您所見,JavaScript每年都會在其語言中加入新的功能。希望我們在上面介紹到的七項提到代碼質(zhì)量的優(yōu)秀實踐,能夠?qū)δ娜粘>幊烫峁椭?/p>
當(dāng)前名稱:提高程序代碼質(zhì)量的七大JavaScript優(yōu)秀實踐
分享地址:http://www.5511xx.com/article/cdcspeg.html