ES2018 是 ECMAScript 標準的最新版本扩所。
它引入了哪些新東西呢稍计?
Rest(剩余)/Spread(展開) 屬性
ES6 在處理數(shù)組解構(gòu)時,引入了 rest(剩余)元素的概念浪册,例如:
JavaScript 代碼:
const numbers = [1, 2, 3, 4, 5]
[first, second, ...others] = numbers
還有展開元素時:
JavaScript 代碼:
const numbers = [1, 2, 3, 4, 5]
const sum = (a, b, c, d, e) => a + b + c + d + e
const sum = sum(...numbers)
ES2018 為對象引入了類似的功能镇草。
rest(剩余) 屬性
JavaScript 代碼:
const { first, second, ...others } = { first: 1, second: 2, third: 3, fourth: 4, fifth: 5 }
first // 1
second // 2
others // { third: 3, fourth: 4, fifth: 5 }
spread(展開) 屬性 允許通過組合展開運算符 ... 之后傳遞的對象屬性來創(chuàng)建新對象:
JavaScript 代碼:
const items = { first, second, ...others }
items //{ first: 1, second: 2, third: 3, fourth: 4, fifth: 5 }
Asynchronous iteration (異步迭代)
新的 for-await-of 構(gòu)造允許您使用異步可迭代對象作為循環(huán)迭代:
JavaScript 代碼:
for await (const line of readLines(filePath)) {
? console.log(line)
}
由于這使用 await 恩尾,你只能在異步函數(shù)中使用它烁峭,就像普通的 await 一樣(參見 async / await 章節(jié))
Promise.prototype.finally()
當一個 promise 得到滿足(fulfilled)時囱稽,它會一個接一個地調(diào)用 then() 方法郊尝。
如果在此期間發(fā)生錯誤,則跳過 then() 方法并執(zhí)行 catch()方法战惊。
finally() 允許您運行一些代碼流昏,無論 promise 的執(zhí)行成功或失敗:
JavaScript 代碼:
fetch('file.json')
? .then(data => data.json())
? .catch(error => console.error(error))
? .finally(() => console.log('finished'))
正則表達式改進
先行斷言(lookahead) 和 后行斷言(lookbehind)
正則表達式后行斷言(lookbehind):根據(jù)前面的內(nèi)容匹配字符串吞获。
下面是一個先行斷言(lookahead):您可以使用 ?= 匹配一個字符串况凉,該字符串后面跟著一個特定的子字符串:
JavaScript 代碼:
/Roger(?=Waters)/
/Roger(?= Waters)/.test('Roger is my dog') //false
/Roger(?= Waters)/.test('Roger is my dog and Roger Waters is a famous musician') //true
?! 執(zhí)行逆操作,匹配一個字符串各拷,該字符串后面沒有一個特定的子字符串:
JavaScript 代碼:
/Roger(?!Waters)/
/Roger(?! Waters)/.test('Roger is my dog') //true
/Roger(?! Waters)/.test('Roger Waters is a famous musician') //false
先行斷言(lookahead)使用 ?= 符號刁绒。它們已經(jīng)可用了。
后行斷言(lookbehind)烤黍,是一個新功能知市,使用 ?< =。
JavaScript 代碼:
/(?<=Roger) Waters/
/(?<=Roger) Waters/.test('Pink Waters is my dog') //false
/(?<=Roger) Waters/.test('Roger is my dog and Roger Waters is a famous musician') //true
后行斷言(lookbehind) 逆操作速蕊,使用 ?< !嫂丙。
JavaScript 代碼:
/(?<!Roger) Waters/
/(?<!Roger) Waters/.test('Pink Waters is my dog') //true
/(?<!Roger) Waters/.test('Roger is my dog and Roger Waters is a famous musician') //false
Unicode 屬性轉(zhuǎn)義 \p{…} 和 \P{…}
在正則表達式模式中,您可以使用 \d 匹配任何數(shù)字规哲,\s 匹配任何不為空格的字符跟啤,\w 匹配任何字母數(shù)字字符,依此類推唉锌。
這個新功能將擴展此概念到引入 \p{} 匹配所有 Unicode 字符隅肥,否定為 \P{} 。
任何 unicode 字符都有一組屬性袄简。 例如腥放,Script 確定語言系列,ASCII 是一個布爾值痘番, 對于 ASCII 字符捉片,值為 true平痰,依此類推。 您可以將此屬性放在花括號中伍纫,正則表達式將檢查是否為真:
JavaScript 代碼:
/^\p{ASCII}+$/u.test('abc')? //?
/^\p{ASCII}+$/u.test('ABC@')? //?
/^\p{ASCII}+$/u.test('ABC') //?
ASCII_Hex_Digit 是另一個布爾屬性宗雇,用于檢查字符串是否僅包含有效的十六進制數(shù)字:
JavaScript 代碼:
/^\p{ASCII_Hex_Digit}+$/u.test('0123456789ABCDEF') //?
/^\p{ASCII_Hex_Digit}+$/u.test('h')? ? ? ? ? ? ? ? //?
還有許多其他布爾屬性,您只需通過在花括號中添加它們的名稱來檢查它們莹规,包括 Uppercase, Lowercase, White_Space, Alphabetic, Emoji 等:
JavaScript 代碼:
/^\p{Lowercase}$/u.test('h') //?
/^\p{Uppercase}$/u.test('H') //?
/^\p{Emoji}+$/u.test('H')? //?
/^\p{Emoji}+$/u.test('') //?
除了這些二進制屬性之外赔蒲,您還可以檢查任何 unicode 字符屬性以匹配特定值。在這個例子中良漱,我檢查字符串是用希臘語還是拉丁字母寫的:
JavaScript 代碼:
/^\p{Script=Greek}+$/u.test('ελληνικ?') //?
/^\p{Script=Latin}+$/u.test('hey') //?
您可以直接在提案上閱讀可使用的 所有屬性 舞虱。
命名捕獲組(Named capturing groups)
在 ES2018 中,可以為捕獲組分配一個名稱母市,而不是僅在結(jié)果數(shù)組中分配一個 slot(插槽):
JavaScript 代碼:
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const result = re.exec('2015-01-02')
// result.groups.year === '2015';
// result.groups.month === '01';
// result.groups.day === '02';
正則表達式的 ‘s’ 標志
s 標志是 ‘single line'(單行)的縮寫矾兜,它使 . 匹配新的行字符。如果沒有它患久,點將匹配普通字符椅寺,而不是新行:
JavaScript 代碼:
/hi.welcome/.test('hi\nwelcome') // false
/hi.welcome/s.test('hi\nwelcome') // true