今年,ECMAScript 2019(簡稱ES2019)將會發表。新功能包括Object.fromEntries(),trimStart(),trimEnd(),flat(),flatMap(),symbol物件的description屬性,可選的catch綁定等。
1、Object.fromEntries()
在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()相同的功能,但它實作方式有些複雜:
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標準中。
2、trimStart() and trimEnd()
#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() 的別名。
3、flat() and flatMap()
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階段。
4、Symbol 物件的 description 屬性
#在創建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
5、可選的catch
try catch 語句中的catch有時候並沒有用,思考下面程式碼:
try { // 使用浏览器可能尚未实现的功能 } catch (unused) { // 这里回调函数中已经帮我们处理好的错误 }
此程式碼中的catch回調的資訊並沒有用處。但這樣寫是為了避免SyntaxError錯誤。 ES2019可以省略catch周圍的括號:
try { // ... } catch { // .... }
另外:ES2020 的String.prototype.matchAll
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 。
更多相关知识请关注JavaScript视频教程栏目
以上是5個ES10的新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版
中文版,非常好用

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。