爲了保證可讀性,本文采用意譯而非直譯。前端
ECMAScript 2015,也稱爲ES6,是一個花了6年時間完成的主要版本。從那時起,負責ECMAScript標準開發的技術委員會39 (TC39)每一年都會發布該標準的新版本。這個年度發佈週期簡化了這個過程,並使新特性快速可用,JavaScript社區對此表示歡迎。git
今年,ECMAScript 2019(簡稱ES2019)將會發布。 新功能包括Object.fromEntries()
,trimStart()
,trimEnd()
,flat()
,flatMap()
,symbol對象的description屬性,可選的catch
綁定等。github
好消息是這些功能已經在最新版本的Firefox和Chrome中實現,而且它們也能夠被轉換,以便舊版瀏覽器可以處理它們。正則表達式
在JavaScript中,將數據從一種格式轉換爲另外一種格式很是常見。 爲了便於將對象轉換爲數組,ES2017引入了Object.entrie()
方法。 此方法將對象做爲參數,並以[key,value]
的形式返回對象本身的可枚舉字符串鍵控屬性對的數組。 例如:編程
const obj = {one: 1, two: 2, three: 3}; console.log(Object.entries(obj)); // => [["one", 1], ["two", 2], ["three", 3]]
可是若是咱們想要作相反的事情並將鍵值對列表轉換爲對象呢? 某些編程語言(如Python)爲此提供了dict()
函數。 在Underscore.js
和Lodash中還有_.fromPairs
函數。數組
ES2019引入Object.fromEntries()
方法爲JavaScript帶來相似的功能, 此靜態方法容許你輕鬆地將鍵值對列表轉換爲對象:瀏覽器
const myArray = [['one', 1], ['two', 2], ['three', 3]]; const obj = Object.fromEntries(myArray); console.log(obj); // => {one: 1, two: 2, three: 3}
如你所見,Object.fromEntries()
與Object.entries()
所作的事情正好相反。 雖然之前能夠實現Object.fromEntries()相同的功能,但它實現方式有些複雜:app
const myArray = [['one', 1], ['two', 2], ['three', 3]]; const Array.from(myArray).reduce((acc, [key, val]) => Object.assign(acc, {[key]: val}), {}) console.log(obj); // => {one: 1, two: 2, three: 3}
請記住,傳遞給Object.fromEntries()
的參數能夠是實現可迭代協議的任何對象,只要它返回一個兩元素,相似於數組的對象便可。編程語言
例如,在如下代碼中,Object.fromEntries()
將Map對象做爲參數,並建立一個新對象,其鍵和對應值由Map中的對給出:函數
const map = new Map(); map.set('one', 1); map.set('two', 2); const obj = Object.fromEntries(map); console.log(obj); // => {one: 1, two: 2}
Object.fromEntries()
方法對於轉換對象也很是有用,思考如下代碼:
const obj = {a: 4, b: 9, c: 16}; // 將對象轉換爲數組 const arr = Object.entries(obj); // 計算數字的平方根 const map = arr.map(([key, val]) => [key, Math.sqrt(val)]); // 將數組轉換回對象 const obj2 = Object.fromEntries(map); console.log(obj2); // => {a: 2, b: 3, c: 4}
上述代碼將對象中的值轉換爲其平方根。 爲此,它首先將對象轉換爲數組,而後使用map()
方法獲取數組中值的平方根,結果是能夠轉換回對象的數組。
使用Object.fromEntries()
的另外一種狀況是處理URL的查詢字符串,如本例所示
const paramsString = 'param1=foo¶m2=baz'; const searchParams = new URLSearchParams(paramsString); Object.fromEntries(searchParams); // => {param1: "foo", param2: "baz"}
此代碼中,查詢字符串將傳遞給 URLSearchParams()
構造函數。 而後將返回值(即URLSearchParams
對象實例)傳遞給Object.fromEntries()
方法,結果是一個包含每一個參數做爲屬性的對象。
Object.fromEntries()
方法目前是第4階段提案,這意味着它已準備好包含在ES2019標準中。
trimStart()
和trimEnd()
方法在實現與trimLeft()
和trimRight()
相同。這些方法目前處於第4階段,將被添加到規範中,以便與padStart()
和padEnd()
保持一致,來看一些例子:
const str = " string "; // es2019 console.log(str.trimStart()); // => "string " console.log(str.trimEnd()); // => " string" // 相同結果 console.log(str.trimLeft()); // => "string " console.log(str.trimRight()); // => " string"
對於Web兼容性,trimLeft()
和trimRight()
將保留爲trimStart()
和trimEnd()
的別名。
flat()
方法能夠將多維數組展平成一維數組
const arr = ['a', 'b', ['c', 'd']]; const flattened = arr.flat(); console.log(flattened); // => ["a", "b", "c", "d"]
之前,咱們常用reduce()
或concat()
來展平多維數組:
const arr = ['a', 'b', ['c', 'd']]; const flattend = [].concat.apply([], arr); // or // const flattened = [].concat(...arr); console.log(flattened); // => ["a", "b", "c", "d"]
請注意,若是提供的數組中有空值,它們會被丟棄:
const arr = ['a', , , 'b', ['c', 'd']]; const flattened = arr.flat(); console.log(flattened); // => ["a", "b", "c", "d"]
flat()
還接受一個可選參數,該參數指定嵌套數組應該被展平的級別數。 若是未提供參數,則將使用默認值1
:
const arr = [10, [20, [30]]]; console.log(arr.flat()); // => [10, 20, [30]] console.log(arr.flat(1)); // => [10, 20, [30]] console.log(arr.flat(2)); // => [10, 20, 30]
flatMap()
方法將map()
和flat()
組合成一個方法。 它首先使用提供的函數的返回值建立一個新數組,而後鏈接該數組的全部子數組元素。 來個例子:
const arr = [4.25, 19.99, 25.5]; console.log(arr.map(value => [Math.round(value)])); // => [[4], [20], [26]] console.log(arr.flatMap(value => [Math.round(value)])); // => [4, 20, 26]
數組將被展平的深度級別爲1
.若是要從結果中刪除項目,只需返回一個空數組:
const arr = [[7.1], [8.1], [9.1], [10.1], [11.1]]; // do not include items bigger than 9 arr.flatMap(value => { if (value >= 10) { return []; } else { return Math.round(value); } }); // returns: // => [7, 8, 9]
除了正在處理的當前元素外,回調函數還將接收元素的索引和對數組自己的引用。flat()
和flatMap()
方法目前處於第4階段。
在建立Symbol時,能夠爲調試目的向其添加description
(描述)。有時候,可以直接訪問代碼中的description
是頗有用的。
ES2019 中爲Symbol
對象添加了只讀屬性 description
,該對象返回包含Symbol
描述的字符串。
let sym = Symbol('foo'); console.log(sym.description); // => foo sym = Symbol(); console.log(sym.description); // => undefined // create a global symbol sym = Symbol.for('bar'); console.log(sym.description); // => bar
try catch
語句中的catch
有時候並無用,思考下面代碼:
try { // 使用瀏覽器可能還沒有實現的功能 } catch (unused) { // 這裏回調函數中已經幫咱們處理好的錯誤 }
此代碼中的catch
回調的信息並無用處。 但這樣寫是爲了不SyntaxError
錯誤。 ES2019能夠省略catch
周圍的括號:
try { // ... } catch { // .... }
matchAll()
方法是ES2020 第4階段提議,它針對正則表達式返回全部匹配(包括捕獲組)的迭代器對象。
爲了與match()
方法保持一致,TC39 選擇了「matchAll」而不是其餘建議的名稱,例如 「matches」 或 Ruby的 「scan」。看個簡單的例子:
const re = /(Dr\. )\w+/g; const str = 'Dr. Smith and Dr. Anderson'; const matches = str.matchAll(re); for (const match of matches) { console.log(match); } // logs: // => ["Dr. Smith", "Dr. ", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined] // => ["Dr. Anderson", "Dr. ", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
此正則表達式中的捕獲組匹配字符「Dr」,後跟一個點和一個空格。\w+
匹配任何單詞字符一次或屢次。 而且g
標誌指示引擎在整個字符串中搜索模式。
以前,必須在循環中使用exec()
方法來實現相同的結果,這不是很是有效:
const re = /(Dr\.) \w+/g; const str = 'Dr. Smith and Dr. Anderson'; let matches; while ((matches = re.exec(str)) !== null) { console.log(matches); } // logs: // => ["Dr. Smith", "Dr.", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined] // => ["Dr. Anderson", "Dr.", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
重要的是要注意儘管match()
方法能夠與全局標誌g
一塊兒使用來訪問全部匹配,但它不提供匹配的捕獲組或索引位置。 比較如下代碼:
const re = /page (\d+)/g; const str = 'page 2 and page 10'; console.log(str.match(re)); // => ["page 2", "page 10"] console.log(...str.matchAll(re)); // => ["page 2", "2", index: 0, input: "page 2 and page 10", groups: undefined] // => ["page 10", "10", index: 11, input: "page 2 and page 10", groups: undefined]
在這篇文章中,咱們仔細研究了 ES2019 中引入的幾個關鍵特性,包括Object.fromEntries()
,trimStart()
, trimEnd()
, flat()
, flatMap()
,symbol
對象的description 屬性以及可選的catch
。
儘管一些瀏覽器尚未徹底實現這些特性,但可使用Babel和其餘JavaScript轉換器,仍然能夠在項目中使用它們。
乾貨系列文章彙總以下,以爲不錯點個Star,歡迎 加羣 互相學習。
https://github.com/qq44924588...
我是小智,公衆號「大遷世界」做者,對前端技術保持學習愛好者。我會常常分享本身所學所看的乾貨,在進階的路上,共勉!
關注公衆號,後臺回覆福利,便可看到福利,你懂的。