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) } }
一個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新特性
之前,這些符號在字符串文字中被視爲行終止符,所以使用它們會致使SyntaxError異常。
若是輸入 Unicode 格式可是超出範圍的字符,在原先JSON.stringify返回格式錯誤的Unicode字符串。如今實現了一個改變JSON.stringify的第3階段提案,所以它爲其輸出轉義序列,使其成爲有效Unicode(並以UTF-8表示)
flat()
方法和 flatMap()
方法flat()
和 flatMap()
本質上就是是概括(reduce) 與 合併(concat)的操做。
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]
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)]
trimStart()
方法和 trimEnd()
方法新增的這兩個方法很好理解,分別去除字符串首尾空白字符,這裏就不用例子說聲明瞭。
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"}
String.prototype.matchAll
matchAll()
方法返回一個包含全部匹配正則表達式及分組捕獲結果的迭代器。 在 matchAll 出現以前,經過在循環中調用regexp.exec來獲取全部匹配項信息(regexp需使用/g標誌
Function.prototype.toString()
如今返回精確字符,包括空格和註釋頭部和尾部的註釋不顯示
catch
綁定以前是try {}catch(e){}
如今是try {}catch{}
BigInt
其中數據類型:String、Number、Boolean、Null、Undefined、Symbol、BigInt