日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ECMAScript新版即將來襲,4個精彩功能值得期待

本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。

創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計制作、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元孟連做網(wǎng)站,已為上家服務(wù),為孟連各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

2020年可能已經(jīng)位列史上最糟糕年份TOP5了。那么不妨忘記今年,期待一下2021會有什么驚喜吧!沒錯,明年我們將迎來新版ECMAScript(也就是常說的JavaScript)。本文中,筆者將快速帶你先來了解一下其為何物。

replaceAll字符串的方法

這一方法早就有了,現(xiàn)有的 replace方法早就應(yīng)該有所成效。也許你不知道,目前來自String對象的 replace方法只會影響所找到的第一個匹配,當(dāng)然,除非你使用正則表達(dá)式而不是簡單的字符串作為第一個參數(shù)。

這并非是很大的進(jìn)步,更多的是一種補(bǔ)充,但還是值得贊賞。

 
 
 
 
  1. const str ="The brown fox is reallybrown"; 
  2.               //Instead of doing this...             const newStr = str.replace(/brown/g, "White"); 
  3.               //You'll be able to do this... 
  4.              const newStr = str.replaceAll("brown", "White"); 

方法和訪問器的私密化修改器

圖源:unsplash

目前還沒聽說私密化有何進(jìn)展(該提案還停留在第三階段),但是作為未來的一個嘗試,我們將能夠?qū)Ψ椒ê驮L問器設(shè)置可見性。這里的“可見性”是指將它們設(shè)置為私人化,意味著我們終于有了保護(hù)代碼的基本方式,并開始慢慢地走向更面向OOP的編碼方式(并不是說我們現(xiàn)在的函數(shù)式方法有什么問題)。

 
 
 
 
  1. classPerson { 
  2.                      constructor(name, birhdate, city) { 
  3.                this.name= name; 
  4.                this.birthdate= birthdate; 
  5.                this.city= age; 
  6.              }                     get #Age() { 
  7.                //return actualage 
  8.              } 
  9.                      #myPrivateMethod() { 
  10.                console.log("You can't use this from outside of this class") 
  11.              } 
  12.            } 

實質(zhì)上,你正在用#字符來使方法或訪問器私密化。這個字符也會成為該名稱的一部分,所以如果你想使用上面所提到的方法,可以簡單地用 this.#Age 或者 this.#myPrivateMethod()。

在這兩種情況下,如果你試圖從一類之外甚至從擴(kuò)展了的類里面使用它們,都會出現(xiàn)異常(要等到有了保護(hù)方法之后再使用)。

終結(jié)器和弱引用?

這兩個有趣的工具可以幫助處理內(nèi)存使用問題,并管理垃圾收集。不過,除非你需要特別注意內(nèi)存的使用,不然不太需要用到這兩個工具。

注意,下面的兩個功能涉及垃圾收集器的工作方式,但安裝啟用只針對一個運(yùn)行時。這意味著編寫依賴于非標(biāo)準(zhǔn)安裝的業(yè)務(wù)邏輯很可能會產(chǎn)生意想不到的結(jié)果。即使有了這些工具,也要在使用前要清楚自己的目的。

(1) 弱引用

在介紹弱引用之前,我先快速介紹一下強(qiáng)引用,以便你理解弱引用的優(yōu)勢。強(qiáng)引用本質(zhì)上是一個指向目標(biāo)的指針,在JavaScript中,這只是一個變量,你已經(jīng)將目標(biāo)分配到這個變量中。比如說:

 
 
 
 
  1. classPerson { 
  2.   constructor(first_name, last_name) { 
  3.     this.first_name = first_name; 
  4.     this.last_name = last_name; 
  5.   }}let myP = new Person("Fernando", "Doglio") 

上文中,myP是一個有效的強(qiáng)引用,直到它不復(fù)存在。一旦對一個對象的所有強(qiáng)引用被消除,那么垃圾收集器就可以自由地銷毀這個對象,并釋放它的內(nèi)存以便用于其他事情。也就是說,有些情況下,比如下面這種,強(qiáng)引用可能會鎖定一個目標(biāo),以至于永遠(yuǎn)無法釋放。

 
 
 
 
  1. classPerson { 
  2.   constructor(first_name, last_name) { 
  3.     this.first_name = first_name; 
  4.     this.last_name = last_name; 
  5.     this.sibling = null;  } 
  6. }last me = new Person("Fernando", "Doglio"); 
  7. last sibling = new Person("My", "Sibling"); 
  8. me.sibling = sibling;sibling.sibling = me; 

在上面的例子中,兩個對象都是相互引用的,所以即使me和sibling變量都不在范圍內(nèi),因此,去掉引用,在內(nèi)部每個對象都對另一個對象有一個強(qiáng)引用。在實踐中,這意味著這些對象永遠(yuǎn)不會被收集。這么做完全沒有問題,除非你是在一個內(nèi)存非常小的設(shè)備中使用JS。

(2) 輸入弱參考

對強(qiáng)引用有所了解之后,弱引用就很好理解啦。弱引用本質(zhì)上是一種保留對象引用而不影響垃圾收集器行為的方法。在前面的例子中,如果sibling性能會使用弱引用構(gòu)造來設(shè)置,那么就可以收集這些對象。弱引用的另一個用例是緩存結(jié)構(gòu),因為人們不希望緩存的對象內(nèi)部引用過于活躍。

 
 
 
 
  1. classMyCache { 
  2.                     constructor() { 
  3.                     this.cache= {} 
  4.                   }                    add(key, obj) {                    this.cache[key] =newWeakRef(obj) 
  5.                   }                    get(key) { 
  6.                     let cachedRef = this.cache[key].deref() 
  7.                     if(cachedRef) return cachedRef; 
  8.                     returnfalse;                  }                } 

上面的例子非?;A(chǔ),使用弱引用就是這么簡單。只要記住,如果你想訪問被引用的對象,要用deref方法。因為這是一個弱引用,就需要檢查deref的返回值,如果它是未定義的,就說明這個對象不再存在,否則可以安全地使用它(因此在 get 方法中進(jìn)行IF檢查)。

(3) 終結(jié)器

現(xiàn)在,在頂部的 cherrie 中,終結(jié)器允許你對弱引用對象收集垃圾的事實做出反應(yīng)。同樣,這也是高度具體化的實現(xiàn),以下是使用方法:

 
 
 
 
  1.   let registry =newFinalizationRegistry( value => { 
  2.  console.log("An object was removed! Message:", value) 
  3. })              let myObject = { 
  4.  //.... 
  5.           registry.register(myObject, "myObject was destroyed") 

本質(zhì)上,這里用了FinalizationRegistry 來創(chuàng)建注冊表,需要用回調(diào)函數(shù)作為參數(shù)。在每次收集一個對象(之前用register 方法注冊的)時都會用到這個函數(shù)。

register 方法本身是用來指定所等待的對象的重構(gòu)方法,它的第二個參數(shù)是在創(chuàng)建注冊表時傳遞給初始定義的回調(diào)的值。建議你少用這個方法,特別是不要想著用它來做業(yè)務(wù),但是可以考慮在特殊情況下用它來解決一些新奇的問題。

Promise.any

圖源:unsplash

在這個版本中,ECMAScript中增加了一個同時處理多個承諾的方法。any方法可以運(yùn)行多個承諾,并用第一個解決的承諾來解決后面的問題,或者等到所有的承諾都失敗并返回到一個AggregateError對象處(它是Error對象的一個子類)。

那么,any和race之間有什么區(qū)別呢?事實上,race只要有一個承諾會實現(xiàn)或失敗,它就會進(jìn)行結(jié)算并返值。然而,any 會用第一個結(jié)算值進(jìn)行結(jié)算,或者等待所有的值都失敗了,再一起恢復(fù)所有錯誤。

 
 
 
 
  1. const promise1 =Promise.reject(0); 
  2.                              const promise2 =newPromise((resolve) =>setTimeout(resolve, 100, 'quick')); 
  3.                              const promise3 =newPromise((resolve) =>setTimeout(resolve, 500, 'slow')); 
  4.               const promises = [promise1, promise2, promise3];              Promise.race(promises).then((value) => console.log(value)); //logs the rejected promise 
  5.                              //vs 
  6.                              Promise.any(promises).then((value) => console.log(value)); //logs "quick" 

注意any實際上忽略了第一個被拒絕的承諾,因為還有其他的承諾正在解決,這就是race和any的主要區(qū)別。

ECMAScript2021的新特征不多,但已經(jīng)被接受的功能筆者看來非常好!使用WeakRef和FinalizationRegistry時要小心哦,它們的功能非常有趣,但它們在不同的運(yùn)行情況下處理的結(jié)果或行為可能會不一樣。

你最喜歡哪個新功能?對于這個版本,你最期待的又是什么呢?


本文標(biāo)題:ECMAScript新版即將來襲,4個精彩功能值得期待
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/cccciod.html