<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ES2021 更新的內(nèi)容!

          共 3104字,需瀏覽 7分鐘

           ·

          2021-08-26 15:08


          2021 年 6 月 22 日,發(fā)布了 ES2021 標(biāo)準(zhǔn),Github 鏈接https://github.com/tc39/ecma262/releases/tag/es2021 。標(biāo)準(zhǔn)在每年的 6 月份正式發(fā)布一次,作為當(dāng)年的正式版本。


          任何人都可以向標(biāo)準(zhǔn)委員會(huì)(又稱 TC39 委員會(huì))提案,要求修改語(yǔ)言標(biāo)準(zhǔn)。


          一種新的語(yǔ)法從提案到變成正式標(biāo)準(zhǔn),需要經(jīng)歷五個(gè)階段。每個(gè)階段的變動(dòng)都需要由 TC39 委員會(huì)批準(zhǔn)。


          1、Stage 0 - Strawman(展示階段)

          2、Stage 1 - Proposal(征求意見階段)

          3、Stage 2 - Draft(草案階段)

          4、Stage 3 - Candidate(候選人階段)

          5、Stage 4 - Finished(定案階段)


          一個(gè)提案只要能進(jìn)入 Stage 2,就差不多肯定會(huì)包括在以后的正式標(biāo)準(zhǔn)里面。ECMAScript 當(dāng)前的所有提案,可以在 TC39 的官方網(wǎng)站 https://tc39.es/ecma262 查看。

          更新內(nèi)容

          This specification, the 12th edition, introduces the replaceAll method for Strings; Promise.any, a Promise combinator that short-circuits when an input value is fulfilled; AggregateError, a new Error type to represent multiple errors at once; logical assignment operators (??=&&=||=); WeakRef, for referring to a target object without preserving it from garbage collection, and FinalizationRegistry, to manage registration and unregistration of cleanup operations performed when target objects are garbage collected; separators for numeric literals (1_000); and Array.prototype.sort was made more precise, reducing the amount of cases that result in an implementation-defined sort order.


          上面是原文內(nèi)容,簡(jiǎn)要介紹了 JavaScript 今年新加了哪些語(yǔ)法,還好不是很多。


          主要有5個(gè)新特性:

          1、邏輯賦值運(yùn)算符:(??=&&=||=)

          2、數(shù)字分隔符:(1_000)

          3、Promise.any & AggregateError

          4、String.prototype.replaceAll

          5、WeakRefs & FinalizationRegistry 對(duì)象

          快速上手

          邏輯賦值運(yùn)算符

          ES2021 引入了三個(gè)新的邏輯賦值運(yùn)算符,將邏輯運(yùn)算符與賦值運(yùn)算符進(jìn)行結(jié)合。


          // 或賦值運(yùn)算符x ||= y// 等同于x || (x = y)
          // 與賦值運(yùn)算符x &&= y// 等同于x && (x = y)
          // Null 賦值運(yùn)算符x ??= y// 等同于x ?? (x = y)


          這三個(gè)運(yùn)算符 ||=、&&=、?? =相當(dāng)于先進(jìn)行邏輯運(yùn)算,然后根據(jù)運(yùn)算結(jié)果,再視情況進(jìn)行賦值運(yùn)算。


          它們的一個(gè)用途是,為變量或?qū)傩栽O(shè)置默認(rèn)值。


          // 老的寫法user.id = user.id || 1;
          // 新的寫法user.id ||= 1;


          上面示例中,user.id 屬性如果不存在,則設(shè)為 1,新的寫法比老的寫法更緊湊一些。


          數(shù)字分隔符

          ES2021,允許 JavaScript 的數(shù)值使用下劃線(_)作為分隔符。


          let budget = 1_000_000_000_000;budget === 10 ** 12 // truebudget === 1000000000000


          String.prototype.replaceAll

          之前,字符串的實(shí)例方法 replace() 只能替換第一個(gè)匹配。


          'aabbcc'.replace('b', '_')// 'aa_bcc'


          上面例子中,replace() 只將第一個(gè) b 替換成了下劃線。


          如果要替換所有的匹配,不得不使用正則表達(dá)式的 g 修飾符。


          'aabbcc'.replace(/b/g, '_')// 'aa__cc'


          正則表達(dá)式畢竟不是那么方便和直觀,ES2021 引入了 replaceAll() 方法,可以一次性替換所有匹配。


          'aabbcc'.replaceAll('b', '_')// 'aa__cc'


          它的用法與 replace() 相同,返回一個(gè)新字符串,不會(huì)改變?cè)址?/p>


          WeakRef

          WeakSet 和 WeakMap 是基于弱引用的數(shù)據(jù)結(jié)構(gòu),ES2021 更進(jìn)一步,提供了 WeakRef 對(duì)象,用于直接創(chuàng)建對(duì)象的弱引用。


          let target = {};let wr = new WeakRef(target);


          上面示例中,target 是原始對(duì)象,構(gòu)造函數(shù) WeakRef() 創(chuàng)建了一個(gè)基于 target 的新對(duì)象 wr。這里,wr 就是一個(gè) WeakRef 的實(shí)例,屬于對(duì) target 的弱引用,垃圾回收機(jī)制不會(huì)計(jì)入這個(gè)引用,也就是說(shuō),wr 的引用不會(huì)妨礙原始對(duì)象 target 被垃圾回收機(jī)制清除。


          FinalizationRegistry

          ES2021 引入了清理器注冊(cè)表功能 FinalizationRegistry,用來(lái)指定目標(biāo)對(duì)象被垃圾回收機(jī)制清除以后,所要執(zhí)行的回調(diào)函數(shù)。


          首先,新建一個(gè)注冊(cè)表實(shí)例。


          const registry = new FinalizationRegistry(heldValue => {  // ....});


          上面代碼中,F(xiàn)inalizationRegistry() 是系統(tǒng)提供的構(gòu)造函數(shù),返回一個(gè)清理器注冊(cè)表實(shí)例,里面登記了所要執(zhí)行的回調(diào)函數(shù)?;卣{(diào)函數(shù)作為 FinalizationRegistry() 的參數(shù)傳入,它本身有一個(gè)參數(shù) heldValue。


          然后,注冊(cè)表實(shí)例的 register() 方法,用來(lái)注冊(cè)所要觀察的目標(biāo)對(duì)象。


          registry.register(theObject, "some value");


          上面示例中,theObject 就是所要觀察的目標(biāo)對(duì)象,一旦該對(duì)象被垃圾回收機(jī)制清除,注冊(cè)表就會(huì)在清除完成后,調(diào)用早前注冊(cè)的回調(diào)函數(shù),并將 some value 作為參數(shù)(前面的 heldValue)傳入回調(diào)函數(shù)。


          了解 Promise.any 可以查看之前的文章:鏈接

          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产无码电影 | 天天怕天天色 | 天天爽夜夜爽AA片免费 | 国产高清无码内射视频在线观看 | 大秀蕉丝袜国产 |