ES9,ES10

ES9新特性:正則表達式

1異步迭代數組

在async/await,你可能在同步循環中調用異步函數,例如:promise

async function process(array){
     for(let i of array){
        await dosomething(i)      
    }  
}

這段代碼不會正常運行,下面這段也不會正常運行:異步

async function process(array){
    array.forEach(async i => {
       await dosomething(i); 
    })
}

這段代碼中,循環自己依舊保持同步,並在內部異步函數以前所有調用完畢。async

ES2018引入異步迭代器(asynchronous iterators),這就像常規迭代器,除了next()方法返回一個promise。所以await能夠和for...of循環一塊兒使用,以串行的方式異步運做函數

async function process(array){
  for await (let i of array){    
    dosomething(i)    
  }      
}

 

2.Promise.finally()

一個promise調用鏈要麼成功到達最後一個.then(),要麼失敗觸發.catch()。在某些狀況下,你想要在不管Promise運行成功仍是失敗,運行相同的代碼,例如清除,刪除對話,關閉數據鏈接等。spa

.funally()容許你指定最終的邏輯:prototype

function dosomething(){
  dosomething1()
 .then(dosomething2)
 .then(dosomething3)
 .catch(err => {
    console.log(err);  
 })
 .finally(() => {});  
}

3.Rest/Spreadcode

解構和擴展regexp

4.正則表達式命名捕獲組(groups)

js正則表達式能夠返回一個匹配對象--一個包含匹配字符串的累數組,例如以YYYY-MM-DD的格式解析日期:

const reDate  = /([0-9]{4})-([0-9]{2})-([0.-9]{2})/,
    match = reDate.exec("2019-04-12"),
    year =  match[1],
    mouth =  match[2],
    day = match[3]

這樣的代碼很難讀懂,而且改變正則表達式的結構有可能改變匹配對象的索引

ES2018容許命名捕獲組使用?<name>,在打開捕獲括號(後當即命名,示例:

const  reDate = /(?<year>[0-9]{4})-(?<mouth>[0-9]{2})-(?<day>[0-9]{2})/,
    match = reDate.exec("2019-04-12"),
   year = match.groups.year,
    mouth = match.groups.mouth,
    day  = match.groups.day 

 

5正則表達式反向斷言

目前js支持先行斷言(lookahead),這意味着匹配會發生,但不會有任何捕獲,而且斷言沒有包含在整個匹配字符字段中,例如:

const  
reLookahead  = /\D(?=\d+)/,
match = reLookahead.exec("$123.23")
console.log(match[0]) //$

ES2018引入以相同方式工做可是匹配前面的反向斷言(lookbehind),這樣我就能夠忽略貨幣符號,單純的捕獲價格數字:

const
reLookbehind  = /(?<=\D)\d+/,
match = reLookbehind.exec("$123.23")
console.log(match[0])  //123

6正則表達式dotAll模式


正則表達式中點.匹配除回車之外的任何單字符,標記s改變這種方式,容許終止符的出現,例如:

/hello.world/.test("hello\nworld");
/hello.world/s.test("hello\nworld");

ES10新特性

1.行分隔符(U + 2028)和段分隔符(U + 2029)符號如今容許在字符串文字中,與JSON匹配

之前,這些符號在字符串文字中被視爲行終止符,所以使用它們會致使SyntaxError異常。

2.更加友好的 JSON.stringify

若是輸入 Unicode 格式可是超出範圍的字符,在原先JSON.stringify返回格式錯誤的Unicode字符串。如今實現了一個改變JSON.stringify的第3階段提案,所以它爲其輸出轉義序列,使其成爲有效Unicode(並以UTF-8表示)

3.新增了Array的 flat()方法和 flatMap()方法

flat()和 flatMap()本質上就是是概括(reduce) 與 合併(concat)的操做。

Array.prototype.flat()

flat() 方法會按照一個可指定的深度遞歸遍歷數組,並將全部元素與遍歷到的子數組中的元素合併爲一個新數組返回。

var arr1 = [1,2,[3,4]];
arr1.flat();//[1,2,3,4];

var arr2 = [1,2,[3,4,[5,6]]];
arr2.flat(); //[1,2,3,4,[5,6]];

var arr3 = [1,2,[3,4,[5,6]]];
arr3.flat(2);//[1,2,3,4,5,6]  參數表示展開的深度
其次,還能夠利用 方法的特性來去除數組的空項flat()
var arr4 = [1,2,,4,5]
arr4.flat();//[1,2,4,5]

Array.prototype.flatMap()

flatMap() 方法首先使用映射函數映射每一個元素,而後將結果壓縮成一個新數組。它與 map 和 深度值1的 flat 幾乎相同,但 flatMap 一般在合併成一種方法的效率稍微高一些。 這裏咱們拿map方法與flatMap方法作一個比較。

var arr1  = [1,2,3,5];
arr1.map(x => [x*2])
//(4) [Array(1), Array(1), Array(1), Array(1)]0: [2]1: [4]2: [6]3: 
arr1.flatMap(x => [x*2])
//(4) [2, 4, 6, 10]
arr1.flatMap(x => [[x*2]])
//(4) [Array(1), Array(1), Array(1), Array(1)]

4.新增了String的 trimStart()方法和 trimEnd()方法

新增的這兩個方法很好理解,分別去除字符串首尾空白字符,這裏就不用例子說聲明瞭。  

5. Object.fromEntries()

Object.entries()方法的做用是返回一個給定對象自身可枚舉屬性的鍵值對數組,其排列與使用 for...in 循環遍歷該對象時返回的順序一致(區別在於 for-in 循環也枚舉原型鏈中的屬性)。

而 Object.fromEntries() 則是 Object.entries() 的反轉。

 經過 Object.fromEntries, 能夠將 Map 轉化爲 Object:

const map1 = new Map([['foo','bar'],['baz',42]])
const obj122 = Object.fromEntries(map1)
obj1
//{foo: "bar", x: 41}

經過 Object.fromEntries, 能夠將 Array 轉化爲 Object:

var obj32 = Object.fromEntries(arr1)
var obj32 = Object.fromEntries(arr21)
obj32
//{0: "a", 1: "b", 2: "c"}

6. String.prototype.matchAll

matchAll() 方法返回一個包含全部匹配正則表達式及分組捕獲結果的迭代器。 在 matchAll 出現以前,經過在循環中調用regexp.exec來獲取全部匹配項信息(regexp需使用/g標誌

7. Function.prototype.toString()如今返回精確字符,包括空格和註釋

頭部和尾部的註釋不顯示

9.修改 catch 綁定

以前是try {}catch(e){}

如今是try {}catch{}

10.新的基本數據類型 BigInt

其中數據類型:String、Number、Boolean、Null、Undefined、Symbol、BigInt

相關文章
相關標籤/搜索