做者:Jimmy Breck-McKye翻譯:瘋狂的技術宅javascript
原文:http://www.breck-mckye.com/bl...前端
未經容許嚴禁轉載java
儘管我在過去 7 年中幾乎天天都在寫 JavaScript 代碼,但不得不認可,我實際上並非很注意 ES 語言的發佈聲明。 async/await
和 Proxies
之類的主要特性是一回事,可是每一年都有穩定的小規模、漸進式的改進在不斷涌現,由於總有一些東西須要學習。程序員
因此在本文中,我收集了一些現代 JavaScript 特性,這些特性在首次發佈時並無帶來太多的關注。其中一些只是編碼質量的提升,而另一些確實很方便,能夠減小不少代碼量。如下是你可能會錯過的一些信息:web
在 JavaScript 中,二進制操做並不常見,但有時也會遇到,不然沒法切實解決你的問題。你可能正在爲低功耗設備編寫高性能代碼,將位壓縮到本地存儲中,在瀏覽器中進行像素 RGB 操做,或者必須處理緊密打包的二進制數據格式。面試
這可能意味着有不少工做須要對二進制數字進行處理,我一直以爲用十進制也能作這些事。好吧,ES6 爲此添加了一個二進制數字格式:0b
正則表達式
const binaryZero = 0b0; const binaryOne = 0b1; const binary255 = 0b11111111; const binaryLong = 0b111101011101101;
這使得處理二進制標誌很是容易:segmentfault
// Pizza toppings const olives = 0b0001; const ham = 0b0010; const pineapple = 0b0100; const artechoke = 0b1000; const pizza_ham_pineapple = pineapple | ham; const pizza_four_seasons = olives | ham | artechoke;
對於八進制數也是如此。在 JS 世界中,這些領域有點小衆,但在網絡和某些文件格式中卻很常見。如今你能夠用語法 0o
處理八進制。數組
不要與 window.isNaN()
混淆,這是一種有着更直觀行爲的新方法。瀏覽器
你會發現,經典的 isNaN
有一些有趣的怪癖:
isNaN(NaN) === true isNaN(null) === false isNaN(undefined) === true isNaN({}) === true isNaN('0/0') === true isNaN('hello') === true
是什麼致使了這種結果?首先,這些參數實際上都不是 NaN
。與以往同樣,問題出在你們「最喜歡的」 JavaScript 特性上:類型強制。經過 Number
函數將 window.isNaN
的參數強制爲數字。
好吧,新的 Number.isNaN()
靜態方法解決了全部問題。它會一勞永逸地返回你提供的自變量與 NaN
的相等性。這是絕對明確的:
Number.isNaN(NaN) === true Number.isNaN(null) === false Number.isNaN(undefined) === false Number.isNaN({}) === false Number.isNaN('0/0') === false Number.isNaN('hello') === false
函數簽名: Number.isNaN : (value: any) => boolean
很高興有一個字面量的語法來表示冪:
2**2 === 4 3**2 === 9 3**3 === 27
(這很奇怪,由於我確信 JavaScript 已經有了這個 —— 我可能一直在考慮 Python)
這個功能值得關注,若是你過去幾年一直在寫 array.indexOf(x)!== -1
這樣的代碼,那麼如今能夠用新的 includes
方法:
[1, 2, 3].includes(2) === true [1, 2, 3].includes(true) === false
includes
用 Same Value Zero Algorithm(幾乎與嚴格等式 ===
相同)進行檢查,但它能夠處理 NaN
值。像相等檢查同樣,它將經過引用而不是內容來比較對象:
const object1 = {}; const object2 = {}; const array = [object1, 78, NaN]; array.includes(object1) === true array.includes(object2) === false array.includes(NaN) === true
includes
能夠經過第二個參數 fromIndex
讓你提供一個偏移量:
// positions 0 1 2 3 4 const array = [1, 1, 1, 2, 2]; array.includes(1, 2) === true array.includes(1, 3) === false
太順手了。
函數簽名: Array.prototype.includes : (match: any, offset?: Int) => boolean
這是一對很棒的功能,若是你要與 web workers 一塊兒作大量的工做,那麼這些特性將被證實是無價的。它們使你能夠直接在進程之間共享內存,並經過設置鎖來避免資源爭搶的狀況。
它們都是至關複雜的 API 功能,所以這裏不回對其進行概述,可是能夠經過 Sitepen 的文章瞭解更多信息。目前有一些瀏覽器還不支持,但有望在將來幾年內獲得改善。
ES2018引入了一整套正則表達式特性:
在支持它的運行時中,你如今能夠用正則表達式來進行前向匹配。例如要查找全部以美圓開頭的數字:
const regex = /(?<=\$)\d+/; const text = 'This cost $400'; text.match(regex) === ['400']
關鍵是新的 lookbehind 搜索組與lookahead 搜索組是一對邪惡的雙胞胎:
Look ahead: (?=abc) Look behind: (?<=abc) Look ahead negative: (?!abc) Look behind negative: (?<!abc)
不幸的是,目前尚未什麼方法能夠爲較舊的瀏覽器支持新的後向語法,因此你目前只能在 Node 上用它。
正則表達式真正強大的功能是可以挑選出子匹配項,並用它們進行一些簡單的解析。可是直到不久前,咱們只能經過數字來引用子匹配項,例如:
const getNameParts = /(\w+)\s+(\w+)/g; const name = "Weyland Smithers"; const subMatches = getNameParts.exec(name); subMatches[1] === 'Weyland' subMatches[2] === 'Smithers'
如今有了一種語法,能夠經過在要命名的每一個組的括號的開頭放置 ?
來分配這些子匹配項(或捕獲組)的名稱:
const getNameParts = /(?<first>\w+)\s(?<last>\w+)/g; const name = "Weyland Smithers"; const subMatches = getNameParts.exec(name); const {first, last} = subMatches.groups first === 'Weyland' last === 'Smithers'
不幸的是,目前暫時只有 Chrome 和 Node 支持。
你只須要提供 /s
標誌,例如 /someRegex./s
、`/anotherRegex./sg
。
我很高興在 MDN 上看到這些內容。
簡單地說,flat()
將多維數組按指定的最大 depth
展平:
const multiDimensional = [ [1, 2, 3], [4, 5, 6], [7,[8,9]] ]; multiDimensional.flat(2) === [1, 2, 3, 4, 5, 6, 7, 8, 9]
flatMap
本質上是一個 map
,也是深度爲 1 的 flat
。當從映射函數返回一個數組,但你不但願結果爲嵌套數據結構時,用它很方便:
const texts = ["Hello,", "today I", "will", "use FlatMap"]; // with a plain map const mapped = texts.map(text => text.split(' ')); mapped === ['Hello', ['today', 'I'], 'will', ['use', 'FlatMap']]; // with flatmap const flatMapped = texts.flatMap(text => text.split(' ')); flatMapped === ['Hello', 'today', 'I', 'will', 'use', 'FlatMap'];
如今你能夠編寫 try/catch 語句,而沒必要綁定拋出的錯誤:
try { // something throws } catch { // don't have to do catch(e) }
順便說一句,對你不關心的 e
的值的捕獲行爲,有時稱爲 Pokémon 異常處理。 ‘由於你要捕獲全部的’!
很小可是很好用:
const padded = ' Hello world '; padded.trimStart() === 'Hello world '; padded.trimEnd() === ' Hello world';