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

這些 JS 的新語法有點東西啊

開發 前端
這是個挺不錯的新語法。其他有些語言是可以用 arr[-1] 來獲取數組末尾的元素,但是對于 JS 來說這是實現不了的事情。因為 [key] 對于對象來說就是在獲取 key 對應的值。

 [[420374]]

TC39 的提案筆者一直有關注,攢了一些有趣的今天來聊聊。

PS:提案總共五個階段,只有到階段 4 才會被納入到發布規范中,其它的只是有幾率會被納入。

.at()

這是個挺不錯的新語法。其他有些語言是可以用 arr[-1] 來獲取數組末尾的元素,但是對于 JS 來說這是實現不了的事情。因為 [key] 對于對象來說就是在獲取 key 對應的值。數組也是對象,對于數組使用 arr[-1] 就是在獲取 key 為 -1 的值。

由于以上原因,我們想獲取末尾元素就得這樣寫 arr[arr.length - 1],以后有了 at 這個方法,我們就可以通過 arr.at(-1) 來拿末尾的元素了,另外同樣適用類數組、字符串。 

  1. // Polyfill  
  2. function at(n) {  
  3.     // ToInteger() abstract op  
  4.     n = Math.trunc(n) || 0;  
  5.     // Allow negative indexing from the end  
  6.     if(n < 0) n += this.length;  
  7.     // OOB access is guaranteed to return undefined  
  8.     if(n < 0 || n >= this.length) return undefined;  
  9.     // Otherwise, this is just normal property access  
  10.     return this[n];  

頂層 await

await 都得用 async 函數包裹大家肯定都知道,這個限制導致我們不能在全局作用域下直接使用 await,必須得包裝一下。

有了這個提案以后,大家就可以直接在頂層寫 await 了,算是一個便利性的提案。

目前該提案已經進入階段 4,板上釘釘會發布。另外其實 Chrome 近期的更新已經支持了該功能。

image-20210620162451146

Error Cause

這個語法主要幫助我們便捷地傳遞 Error。一旦可能出錯的地方一多,我們實際就不清楚錯誤到底是哪里產生的。如果希望外部清楚的知道上下文信息的話,我們需要封裝以下 error。 

  1. async function getSolution() {  
  2.   const rawResource = await fetch('//domain/resource-a')  
  3.     .catch(err => {  
  4.       // How to wrap the error properly?  
  5.       // 1. throw new Error('Download raw resource failed: ' + err.message); 
  6.       // 2. const wrapErr = new Error('Download raw resource failed');  
  7.       //    wrapErr.cause = err
  8.       //    throw wrapErr;  
  9.       // 3. class CustomError extends Error {  
  10.       //      constructor(msg, cause) {  
  11.       //        super(msg);  
  12.       //        this.cause = cause;  
  13.       //      } 
  14.       //    }  
  15.       //    throw new CustomError('Download raw resource failed', err);  
  16.     }) 
  17.    const jobResult = doComputationalHeavyJob(rawResource);  
  18.   await fetch('//domain/upload', { method: 'POST', body: jobResult });  
  19. await doJob(); // => TypeError: Failed to fetch 

那么有了這個語法以后,我們可以這樣來簡化代碼: 

  1. async function doJob() {  
  2.   const rawResource = await fetch('//domain/resource-a')  
  3.     .catch(err => {  
  4.       throw new Error('Download raw resource failed', { cause: err });  
  5.     }); 
  6.   const jobResult = doComputationalHeavyJob(rawResource);  
  7.   await fetch('//domain/upload', { method: 'POST', body: jobResult })  
  8.     .catch(err => {  
  9.       throw new Error('Upload job result failed', { cause: err });  
  10.     });  
  11.  
  12. try {  
  13.   await doJob();  
  14. } catch (e) {  
  15.   console.log(e);  
  16.   console.log('Caused by', e.cause);  
  17.  
  18. // Error: Upload job result failed  
  19. // Caused by TypeError: Failed to fetch 

管道運算符

這個語法的 Star 特別多,有 5k 多個,側面也能說明是個受歡迎的語法,但是距離發布應該還有好久,畢竟這個提案三四年前就有了,目前還只到階段 1。

這個語法其實在其他函數式編程語言上很常見,主要是為了函數調用方便: 

  1. let result = exclaim(capitalize(doubleSay("hello")));  
  2. result //=> "Hello, hello!"  
  3. let result = "hello"  
  4.   |> doubleSay  
  5.   |> capitalize  
  6.   |> exclaim;  
  7. result //=> "Hello, hello!" 

這只是對于單個參數的用法,其它的用法有興趣的讀者可以自行閱讀提案,其中涉及到了特別多的內容,這大概也是導致推進階段慢的原因吧。

新的數據結構:Records & Tuples

這個數據結構筆者覺得發布以后會特別有用,總共新增了兩種數據結構,我們可以通過 # 來聲明:

1. #{ x: 1, y: 2 }2.#[1, 2, 3, 4]

這種數據結構是不可變的,類似 React 中為了做性能優化會引入的 immer 或者 immutable.js,其中的值只接受基本類型或者同是不可變的數據類型。 

  1. const proposal = #{  
  2.   id: 1234,  
  3.   title: "Record & Tuple proposal",  
  4.   contents: `...`,  
  5.   // tuples are primitive types so you can put them in records:  
  6.   keywords: #["ecma", "tc39", "proposal", "record", "tuple"],  
  7. };  
  8. // Accessing keys like you would with objects!  
  9. console.log(proposal.title); // Record & Tuple proposal  
  10. console.log(proposal.keywords[1]); // tc39  
  11. // Spread like objects!  
  12. const proposal2 = #{  
  13.   ...proposal,  
  14.   title: "Stage 2: Record & Tuple",  
  15. };  
  16. console.log(proposal2.title); // Stage 2: Record & Tuple  
  17. console.log(proposal2.keywords[1]); // tc39  
  18. // Object functions work on Records:  
  19. console.log(Object.keys(proposal)); // ["contents", "id", "keywords", "title"] 

最后

以上筆者列舉了一部分有意思的 TC39 提案,除了以上這些還有很多提案,各位讀者有興趣的話可以在 TC39 中尋找。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2020-12-14 05:57:01

clipboard.Selection execCommand

2024-06-13 10:24:28

2024-06-14 08:08:02

2022-08-19 12:12:02

TypeScriptInfer 類型

2021-10-15 10:26:28

鴻蒙HarmonyOS應用

2010-03-29 10:45:48

HTML 5

2024-06-19 08:45:13

2025-05-08 16:44:54

AI應用LazyLLM

2010-09-09 15:32:48

SQL插入數據

2025-05-28 08:25:00

JavaScript代碼開發

2009-07-08 18:07:58

jvm jre

2023-11-06 19:00:17

Python

2024-03-15 08:45:31

Vue 3setup語法

2021-12-28 08:46:00

Vue3refreactive

2021-04-06 21:30:56

代碼SPI重構

2012-05-22 01:49:22

Highlight.jJavaWEB

2021-12-05 23:17:18

iOS蘋果系統

2021-01-03 09:44:34

解壓軟件解壓神器應用

2019-03-26 09:20:12

蘋果 iOS系統

2017-09-26 10:00:15

前端JS語法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.日韩高清 | 精品国产一区二区三区性色av | 日韩精品免费在线 | 操操日 | 日韩一区二区三区在线 | 亚洲日本视频 | a黄视频 | 久久国产精品一区二区 | 一区二区久久电影 | 91亚洲国产成人久久精品网站 | 国产精品视频久久久久久 | 中文字幕在线视频精品 | 欧美日韩国产中文字幕 | 国产精品不卡 | 亚洲精品电影网在线观看 | 久久久久久久久久久久久九 | 久久久久中文字幕 | 日本a视频 | 在线观看国产视频 | 人人看人人爽 | 97日日碰人人模人人澡分享吧 | 国产在线视频一区 | 亚洲视频一区在线观看 | 99久久免费精品国产男女高不卡 | 91豆花视频 | 在线一区二区三区 | 亚洲国产精品久久久 | 国产精品久久二区 | 日韩视频中文字幕 | 国产视频导航 | 中文字幕一区二区三区四区五区 | 午夜一区二区三区在线观看 | 日韩免费高清视频 | 91网在线观看| 色就是色欧美 | 久久综合狠狠综合久久综合88 | 欧美无乱码久久久免费午夜一区 | 亚洲va中文字幕 | 久久一区二区视频 | 亚洲国产精品视频 | 国产精品九九九 |