成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ES2018中4個有用的功能

開發 前端
ES2018 規范引入了四個新功能。這些功能包括異步迭代,rest/spread 屬性,Promise.prototype.finally() 和正則表達式改進。本問將幫你了解這些 ES2018 功能的工作原理及使用方法。

ES2018 規范引入了四個新功能。這些功能包括異步迭代,rest/spread 屬性,Promise.prototype.finally() 和正則表達式改進。本問將幫你了解這些 ES2018 功能的工作原理及使用方法。

異步迭代

異步迭代是討論的比較少 ES2018 功能之一。雖然還有很多關于 ES2018 其他功能的討論,但幾乎沒有關于異步迭代這方面的內容。通過異步迭代,我們可以得到異步的可迭代對象和迭代器。

這意味著你可以把 await 關鍵字與 for…of 循環放在一起使用。你可以用這些循環對可迭代對象進行迭代。可迭代對象的包括數組、map、set,NodeList,函數的 arguments 參數,TypedArray 等。

在 ES2018 之前,for...of 循環是同步的。如果你試著迭代涉及異步操作的可迭代對象并 await,則無法正常工作。循環本身會保持同步,基本上忽略 await ,并在其內部的異步操作可以完成之前完成迭代。

  1. // 下面的代碼在 ES2018 之前不起作用,因為循環保持同步。 
  2. // 創建一個異步函數: 
  3. async function processResponses(someIterable) { 
  4.   // 對可迭代對象進行迭代 
  5.   for (let item of someIterable) { 
  6.     // 通過異步操作處理項目,例如promise: 
  7.     await processItem(item) 
  8.   } 

同時 for...of 循環也可以與異步代碼一起使用。也就是說可以在遍歷可迭代對象時執行一些異步操作。for...of 循環將會是異步的,讓你能夠等待異步操作完成。

需要記住的是在哪里使用 await 關鍵字。不需要把它放進循環體中,應該將其放在for...of關鍵字中 for 的后面。現在當你用 next() 方法獲取異步迭代器的下個值時,將會得到一個 Promise。如果你想了解更多信息,可以在 GitHub 上去看看(https://github.com/tc39/proposal-async-iteration)。

  1. // 創建一個異步函數: 
  2. async function processResponses(someIterable) { 
  3.   //遍歷可迭代對象并等待異步操作的結果 
  4.   for await (let item of someIterable) { 
  5.     processItem(item) 
  6.   } 

Rest/Spread 屬性

rest 和 spread 并不是真正的新功能。兩者都是在 ES6 中作為新的運算符引入的,它們很快就開始流行起來。可以說 JavaScript 程序員喜歡它們。唯一的問題是它們只能用在數組和參數上,不過 ES2018 把這兩個功能引入了對象中。

rest 和 spread 運算符的語法都非常簡單,由三個點(...)組成。這些點后面是要在其上使用 rest 或 spread 運算符的對象。接下來簡單的討論一下兩者的工作原理。

對象的 rest 運算符

rest 運算符使你可以將對象的所有剩余對象屬性屬性提取到新對象上。要注意這些屬性必須是可枚舉的。如果你已經對某些屬性使用了分解,那么 rest 運算符會只提取剩余的屬性。

  1. // Rest example: 
  2.  
  3. const daysObj = { 
  4.   one: 'Monday', 
  5.   two: 'Tuesday', 
  6.   three: 'Wednesday', 
  7.   four: 'Thursday', 
  8.   five: 'Friday' 
  9.  
  10. //使用解構將變量的前兩個屬性分配給變量。 
  11. //然后,使用rest將其余屬性分配給第三個變量。 
  12. const { one, two, ...restOfDays } = daysObj 
  13. // rest 僅提取 "three", "four" 和 "five"  
  14. // 因為我們已經提取了 "one" 和 "two"  
  15.  
  16. console.log(one) 
  17. // Output: 
  18. // 'Monday' 
  19.  
  20. console.log(two) 
  21. // Output: 
  22. // 'Tuesday' 
  23.  
  24. console.log(restOfDays) 
  25. // Output: 
  26. // { three: 'Wednesday', four: 'Thursday', five: 'Friday' } 

如果要對對象使用 rest 運算符,需要記住兩點:首先,只能用一次,除非把它用在嵌套對象上。其次,必須在最后使用。這就是為什么在上面的例子中,在解構前兩個屬性之后而不是之前看到它的原因。

  1. // 這行代碼不起作用,因為把 rest 運算符用在了最前面: 
  2. const { ...all, one, two } = { one: 1, two: 2, three: 3 } 
  3.  
  4. //這行能起作用: 
  5. const { one, two, ...all } = { one: 1, two: 2, three: 3 } 
  6.  
  7. // 這行不起作用,因為同一級別上有多個 rest 運算符: 
  8. const { one, ...some, ...end } = { /* some properties */ } 
  9.  
  10. // 這行能起作用,在多個級別上的多個 rest 運算符: 
  11. const { one, {...secondLevel }, ...firstLevel } = { /* some properties */ } 

對象的 spread 運算符

spread 運算符的作用是可以通過插入另一個對象的所有屬性來創建新對象。Spread 運算符還允許你從多個對象插入屬性。也可以把這個運算符與添加新屬性結合使用。

  1. // Spread example: 
  2. const myOriginalObj = { name: 'Joe Doe', age: 33 } 
  3. // 用 spread 運算符創建新對象: 
  4. const myNewObj = { ...myOriginalObj } 
  5.  
  6. console.log(myNewObj) 
  7. // Output: 
  8. // { name: 'Joe Doe', age: 33 } 
  9.  
  10.  
  11. // 添加屬性的例子: 
  12. const myOriginalObj = { name: 'Caesar' } 
  13. // 用 spread 運算符創建新對象 
  14. // 并添加新的屬性“genre”: 
  15. const myNewObj = { ...myOriginalObj, genre: 'Strategy' } 
  16.  
  17. console.log(myNewObj) 
  18. // Output: 
  19. // { 
  20. //   name: 'Caesar', 
  21. //   genre: 'Strategy' 
  22. // } 
  23.  
  24.  
  25. // Spread 運算符并合并兩個對象: 
  26. const myObjOne = { title: 'Eloquent JavaScript' } 
  27. const myObjTwo = { author: 'Marijn Haverbeke' } 
  28.  
  29. const myNewObj = { ...myObjOne, ...myObjTwo } 
  30.  
  31. console.log(myNewObj) 
  32. // Output: 
  33. // { 
  34. //   title: 'Eloquent JavaScript', 
  35. //   author: 'Marijn Haverbeke' 
  36. // } 

當從多個對象插入屬性并添加新屬性時,順序很重要。

我來解釋一下,假設你要用 spread 運算符基于兩個現有對象創建一個新對象。第一個已有對象中包含具有某些值的屬性 title。第二個對象也包含屬性 title,但是值不一樣。最終到底取哪個 title?

答案是最后一個。如果對第一個對象使用 spread 運算符,然后再對第二個對象使用,則第二個 title 會生效。如果你將 spread 運算符永在第二個對象上,則第一個 title會生效。

  1. // Spread 運算符并合并兩個對象: 
  2. const myObjOne = { 
  3.   title: 'Eloquent JavaScript', 
  4.   author: 'Marijn Haverbeke', 
  5.  
  6. const myObjTwo = { 
  7.   title: 'You Don\'t Know JS Yet', 
  8.   language: 'English' 
  9.  
  10. // 用 spread 運算符通過組合 “myObjOne” 和 “myObjTwo” 創建新對象 
  11. // 注意:“myObjTwo” 中的 “title” 會將覆蓋 “myObjTwo” 的 “title” 
  12. // 因為“ myObjTwo”排在最后。 
  13. const myNewObj = { ...myObjOne, ...myObjTwo } 
  14.  
  15. console.log(myNewObj) 
  16. // Output: 
  17. // { 
  18. //   title: "You Don't Know JS Yet", 
  19. //   author: 'Marijn Haverbeke', 
  20. //   language: 'English' 
  21. // } 
  22.  
  23.  
  24. // 注意:“myObjOne” 中的 “title” 將覆蓋 “myObjTwo” 的 “title” 
  25. const myNewObj = { ...myObjTwo, ...myObjOne } 
  26.  
  27. console.log(myNewObj) 
  28. // Output: 
  29. // { 
  30. //   title: 'Eloquent JavaScript', 
  31. //   language: 'English', 
  32. //   author: 'Marijn Haverbeke' 
  33. // } 

Promise.prototype.finally()

一開始有兩個用于 Promise 的回調函數。其中一個是 then(),在實現諾 Promise 執行。第二個是catch(),在 promise 被拒絕或 then() 拋出異常時執行。ES2018 增加了用于 Promise 的第三個回調函數 finally()。

每次完成 promise 時,都會執行 finally() 回調,不管 promise 是否完成。這個回調的一般用于執行應始終發生的操作。例如關閉模態對話框、關閉數據庫連接或進行某些清理。

  1. // finally() example: 
  2. fetch() 
  3.   .then(response => response.json()) 
  4.   .then(data => console.log(data)) 
  5.   .catch(error => console.log(error)) 
  6.   //最后做點什么: 
  7.   .finally(() => console.log('Operation done.')) 

對正則表達式的改進

ES2018 還對正則表達式功能進行了的一些改進。這些改進包括 s(dotAll) 標志,后行斷言,命名捕獲組和 unicode 屬性轉義。

s(dotAll)

首先是 s(dotAll) 。與點(.)不同,s(dotAll) 允許對換行符及表情符號進行匹配。

  1. // s(dotAll) example: 
  2. /hello.world/.test('hello\nworld') 
  3. // Output: 
  4. // false 
  5.  
  6. /hello.world/s.test('hello\nworld') 
  7. // Output: 
  8. // true 

后行斷言

在ES2018之前,JavaScript僅支持先行斷言。先行斷言用于基于其后的文本來匹配模式。在 ES2018 中增加了對后行斷言的支持。通過它可以基于模式之前的文本模式來進行匹配。后行斷言的語法為 ?<=。

  1. // 后行斷言例子: 
  2. /(?<=green) apple/.test('One red apple is on the table.') 
  3. // Output: 
  4. // false 
  5.  
  6. /(?<=green) apple/.test('One green apple is on the table.') 
  7. // Output: 
  8. // true 

斷言后面也有一個反向的回溯。僅當子字符串之前沒有斷言時,此斷言才與模式匹配。對后行斷言取反操作的語法是 ?<!。

  1. /(?<!green) apple/.test('One red apple is on the table.') 
  2. // Output: 
  3. // true 
  4.  
  5. /(?<!green) apple/.test('One green apple is on the table.') 
  6. // Output: 
  7. // false 

命名捕獲組

另一個被 ES2018 引入到正則表達式的好功能是命名捕獲組。命名捕獲組的語法為 ?<some_name>。

  1. const date_pattern = /(?<day>\d{2})\/(?<month>\d{2})\/(?<year>\d{4})/ 
  2. const result = date_pattern.exec('11/12/2021') 
  3.  
  4. console.log(result) 
  5. // Output: 
  6. // [ 
  7. //   '11/12/2021', 
  8. //   '11', 
  9. //   '12', 
  10. //   '2021', 
  11. //   index: 0, 
  12. //   input: '11/12/2021', 
  13. //   groups: [Object: null prototype] { day: '11', month: '12', year: '2021' } 
  14. // ] 
  15.  
  16. console.log(result.groups.day) 
  17. // Output: 
  18. // '11' 
  19.  
  20. console.log(result.groups.month) 
  21. // Output: 
  22. // '12' 
  23.  
  24. console.log(result.groups.year) 
  25. // Output: 
  26. // '2021' 

Unicode 屬性轉義

每個 unicode 字符都有許多屬性。例如:空白字符,大小寫,字母,ASCII,表情符號等。現在你可以在正則表達式中訪問這些屬性了。

要使用這個功能需要做兩件事。首先必須使用 /u 標志。這個標志告訴 JavaScript 你的字符串是一系列 Unicode 代碼點。第二是使用 \p{}。你要檢查的屬性位于大括號之間,反之則用 \P{}。

  1. // 用俄語創建一個字符串(西里爾字母): 
  2. const myStrCyr = 'Доброе утро' 
  3.  
  4. //創建英文字符串(拉丁字母): 
  5. const myStrLat = 'Good morning' 
  6.  
  7. //測試“ myStrCyr”是否包含西里爾字符: 
  8. /\p{Script=Cyrillic}/u.test(myStrCyr) // true 
  9.  
  10. //測試“ myStrLat”是否包含西里爾字符: 
  11. /\p{Script=Cyrillic}/u.test(myStrLat) // false 
  12.  
  13. // 測試“myStrLat” 是否包含西里爾字符: 
  14. /\p{Script=Latin}/u.test(myStrCyr) // false 
  15.  
  16. // 測試“myStrLat” 是否包含拉丁語字符: 
  17. /\p{Script=Latin}/u.test(myStrLat) // true 

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2021-03-09 09:14:27

ES2019JavaScript開發

2013-11-05 10:03:22

Eclipse功能

2013-07-12 09:45:16

PHP功能

2020-06-21 13:57:21

JavaScript開發代碼

2021-04-29 08:28:24

架構參數傳遞

2020-10-14 11:10:52

ES2020JavaScript前端

2020-10-23 19:50:15

ES2020Javascript1前端

2010-07-14 10:02:47

IMAP4功能

2020-05-20 13:45:52

Linuxtouch命令

2020-06-22 08:09:22

GitHub工具開發

2015-07-22 17:19:20

Linux命令技巧

2022-05-05 19:00:22

PythonPython特性

2014-09-18 09:50:32

Ruby on Rai

2022-01-11 19:31:33

GNOME桌面應用

2023-11-24 08:31:03

ECMAScriptES2021

2015-10-27 15:45:27

Web開發CSS代碼

2015-10-27 11:02:06

Web開發CSS 庫

2009-05-18 16:58:56

Java代碼片段

2023-10-26 07:47:35

JavaScript代碼變量

2014-06-13 11:26:53

CSS庫Web開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 麻豆久久久 | 久国产精品 | 国产99视频精品免费视频7 | 欧美一二三 | 毛片一级黄色 | av一区二区三区四区 | 亚洲精品免费在线 | 天天躁日日躁xxxxaaaa | 日韩久久网 | 日韩图区| 亚洲免费大片 | 日韩a视频 | 国产专区在线 | 91麻豆精品国产91久久久更新资源速度超快 | 国产乱码精品一区二区三区中文 | 伊人在线 | 中文字幕一区二区三区在线乱码 | 国内精品免费久久久久软件老师 | 色视频欧美 | 国产激情在线 | 99久久免费精品国产男女高不卡 | 在线欧美视频 | 欧美在线a | 天天射中文 | 欧美国产一区二区三区 | 国产精品亚洲第一 | 91久久国产综合久久 | 国产精品一区二区在线播放 | 精品日本久久久久久久久久 | 国产一区二区在线播放 | 欧美日韩国产三级 | 色视频在线免费观看 | 亚洲精品日韩在线 | 国内激情av片 | 欧美日韩亚洲一区 | 成人久草| 国产精品中文字幕在线观看 | 久久国内精品 | 免费观看毛片 | 亚洲国产高清在线观看 | 成人av电影天堂 |