本篇內(nèi)容主要講解“ECMAScript新版的功能有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“ECMAScript新版的功能有哪些”吧!
成都創(chuàng)新互聯(lián)主營(yíng)本溪網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都APP應(yīng)用開(kāi)發(fā),本溪h5小程序開(kāi)發(fā)搭建,本溪網(wǎng)站營(yíng)銷(xiāo)推廣歡迎本溪等地區(qū)企業(yè)咨詢(xún)
replaceAll字符串的方法
這一方法早就有了,現(xiàn)有的 replace方法早就應(yīng)該有所成效。也許你不知道,目前來(lái)自String對(duì)象的 replace方法只會(huì)影響所找到的第一個(gè)匹配,當(dāng)然,除非你使用正則表達(dá)式而不是簡(jiǎn)單的字符串作為第一個(gè)參數(shù)。
這并非是很大的進(jìn)步,更多的是一種補(bǔ)充,但還是值得贊賞。
const str ="The brown fox is reallybrown"; //Instead of doing this... const newStr = str.replace(/brown/g, "White"); //You'll be able to do this... const newStr = str.replaceAll("brown", "White");
方法和訪(fǎng)問(wèn)器的私密化修改器
目前還沒(méi)聽(tīng)說(shuō)私密化有何進(jìn)展(該提案還停留在第三階段),但是作為未來(lái)的一個(gè)嘗試,我們將能夠?qū)Ψ椒ê驮L(fǎng)問(wèn)器設(shè)置可見(jiàn)性。這里的“可見(jiàn)性”是指將它們?cè)O(shè)置為私人化,意味著我們終于有了保護(hù)代碼的基本方式,并開(kāi)始慢慢地走向更面向OOP的編碼方式(并不是說(shuō)我們現(xiàn)在的函數(shù)式方法有什么問(wèn)題)。
classPerson { constructor(name, birhdate, city) { this.name= name; this.birthdate= birthdate; this.city= age; } get #Age() { //return actualage } #myPrivateMethod() { console.log("You can't use this from outside of this class") } }
實(shí)質(zhì)上,你正在用#字符來(lái)使方法或訪(fǎng)問(wèn)器私密化。這個(gè)字符也會(huì)成為該名稱(chēng)的一部分,所以如果你想使用上面所提到的方法,可以簡(jiǎn)單地用 this.#Age 或者 this.#myPrivateMethod()。
在這兩種情況下,如果你試圖從一類(lèi)之外甚至從擴(kuò)展了的類(lèi)里面使用它們,都會(huì)出現(xiàn)異常(要等到有了保護(hù)方法之后再使用)。
終結(jié)器和弱引用
這兩個(gè)有趣的工具可以幫助處理內(nèi)存使用問(wèn)題,并管理垃圾收集。不過(guò),除非你需要特別注意內(nèi)存的使用,不然不太需要用到這兩個(gè)工具。
注意,下面的兩個(gè)功能涉及垃圾收集器的工作方式,但安裝啟用只針對(duì)一個(gè)運(yùn)行時(shí)。這意味著編寫(xiě)依賴(lài)于非標(biāo)準(zhǔn)安裝的業(yè)務(wù)邏輯很可能會(huì)產(chǎn)生意想不到的結(jié)果。即使有了這些工具,也要在使用前要清楚自己的目的。
(1) 弱引用
在介紹弱引用之前,我先快速介紹一下強(qiáng)引用,以便你理解弱引用的優(yōu)勢(shì)。強(qiáng)引用本質(zhì)上是一個(gè)指向目標(biāo)的指針,在JavaScript中,這只是一個(gè)變量,你已經(jīng)將目標(biāo)分配到這個(gè)變量中。比如說(shuō):
classPerson { constructor(first_name, last_name) { this.first_name = first_name; this.last_name = last_name; }}let myP = new Person("Fernando", "Doglio")
上文中,myP是一個(gè)有效的強(qiáng)引用,直到它不復(fù)存在。一旦對(duì)一個(gè)對(duì)象的所有強(qiáng)引用被消除,那么垃圾收集器就可以自由地銷(xiāo)毀這個(gè)對(duì)象,并釋放它的內(nèi)存以便用于其他事情。也就是說(shuō),有些情況下,比如下面這種,強(qiáng)引用可能會(huì)鎖定一個(gè)目標(biāo),以至于永遠(yuǎn)無(wú)法釋放。
classPerson { constructor(first_name, last_name) { this.first_name = first_name; this.last_name = last_name; this.sibling = null; } }last me = new Person("Fernando", "Doglio"); last sibling = new Person("My", "Sibling"); me.sibling = sibling;sibling.sibling = me;
在上面的例子中,兩個(gè)對(duì)象都是相互引用的,所以即使me和sibling變量都不在范圍內(nèi),因此,去掉引用,在內(nèi)部每個(gè)對(duì)象都對(duì)另一個(gè)對(duì)象有一個(gè)強(qiáng)引用。在實(shí)踐中,這意味著這些對(duì)象永遠(yuǎn)不會(huì)被收集。這么做完全沒(méi)有問(wèn)題,除非你是在一個(gè)內(nèi)存非常小的設(shè)備中使用JS。
(2) 輸入弱參考
對(duì)強(qiáng)引用有所了解之后,弱引用就很好理解啦。弱引用本質(zhì)上是一種保留對(duì)象引用而不影響垃圾收集器行為的方法。在前面的例子中,如果sibling性能會(huì)使用弱引用構(gòu)造來(lái)設(shè)置,那么就可以收集這些對(duì)象。弱引用的另一個(gè)用例是緩存結(jié)構(gòu),因?yàn)槿藗儾幌M彺娴膶?duì)象內(nèi)部引用過(guò)于活躍。
classMyCache { constructor() { this.cache= {} } add(key, obj) { this.cache[key] =newWeakRef(obj) } get(key) { let cachedRef = this.cache[key].deref() if(cachedRef) return cachedRef; returnfalse; } }
上面的例子非?;A(chǔ),使用弱引用就是這么簡(jiǎn)單。只要記住,如果你想訪(fǎng)問(wèn)被引用的對(duì)象,要用deref方法。因?yàn)檫@是一個(gè)弱引用,就需要檢查deref的返回值,如果它是未定義的,就說(shuō)明這個(gè)對(duì)象不再存在,否則可以安全地使用它(因此在 get 方法中進(jìn)行IF檢查)。
(3) 終結(jié)器
現(xiàn)在,在頂部的 cherrie 中,終結(jié)器允許你對(duì)弱引用對(duì)象收集垃圾的事實(shí)做出反應(yīng)。同樣,這也是高度具體化的實(shí)現(xiàn),以下是使用方法:
let registry =newFinalizationRegistry( value => { console.log("An object was removed! Message:", value) }) let myObject = { //.... } registry.register(myObject, "myObject was destroyed")
本質(zhì)上,這里用了FinalizationRegistry 來(lái)創(chuàng)建注冊(cè)表,需要用回調(diào)函數(shù)作為參數(shù)。在每次收集一個(gè)對(duì)象(之前用register 方法注冊(cè)的)時(shí)都會(huì)用到這個(gè)函數(shù)。
register 方法本身是用來(lái)指定所等待的對(duì)象的重構(gòu)方法,它的第二個(gè)參數(shù)是在創(chuàng)建注冊(cè)表時(shí)傳遞給初始定義的回調(diào)的值。建議你少用這個(gè)方法,特別是不要想著用它來(lái)做業(yè)務(wù),但是可以考慮在特殊情況下用它來(lái)解決一些新奇的問(wèn)題。
Promise.any
在這個(gè)版本中,ECMAScript中增加了一個(gè)同時(shí)處理多個(gè)承諾的方法。any方法可以運(yùn)行多個(gè)承諾,并用第一個(gè)解決的承諾來(lái)解決后面的問(wèn)題,或者等到所有的承諾都失敗并返回到一個(gè)AggregateError對(duì)象處(它是Error對(duì)象的一個(gè)子類(lèi))。
那么,any和race之間有什么區(qū)別呢?事實(shí)上,race只要有一個(gè)承諾會(huì)實(shí)現(xiàn)或失敗,它就會(huì)進(jìn)行結(jié)算并返值。然而,any 會(huì)用第一個(gè)結(jié)算值進(jìn)行結(jié)算,或者等待所有的值都失敗了,再一起恢復(fù)所有錯(cuò)誤。
const promise1 =Promise.reject(0); const promise2 =newPromise((resolve) =>setTimeout(resolve, 100, 'quick')); const promise3 =newPromise((resolve) =>setTimeout(resolve, 500, 'slow')); const promises = [promise1, promise2, promise3]; Promise.race(promises).then((value) => console.log(value)); //logs the rejected promise //vs Promise.any(promises).then((value) => console.log(value)); //logs "quick"
注意any實(shí)際上忽略了第一個(gè)被拒絕的承諾,因?yàn)檫€有其他的承諾正在解決,這就是race和any的主要區(qū)別。
ECMAScript2021的新特征不多,但已經(jīng)被接受的功能筆者看來(lái)非常好!使用WeakRef和FinalizationRegistry時(shí)要小心哦,它們的功能非常有趣,但它們?cè)诓煌倪\(yùn)行情況下處理的結(jié)果或行為可能會(huì)不一樣。
到此,相信大家對(duì)“ECMAScript新版的功能有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!