- Свойства покоя/Распространения
- Асинхронная итерация
- Обещание.прототип. наконец()
- Улучшения регулярных выражений
- Регулярное выражение поисковых утверждений: сопоставьте строку в зависимости от того, что ей предшествует
- Свойство Unicode экранирует \p{…} и \P{…}
- Именованные группы захвата
- Флаг s для регулярных выражений
ES2018 – это последняя версия стандарта ECMAScript.
Что нового в нем появилось?
Свойства покоя/Распространения
ES6 ввел понятие элемента rest при работе с деструктурированием массива :
const numbers = [1, 2, 3, 4, 5] [first, second, ...others] = numbers
и элементы распространения :
const numbers = [1, 2, 3, 4, 5] const sum = (a, b, c, d, e) => a + b + c + d + e const sumOfNumbers = sum(...numbers)
ES2018 вводит то же самое, но для объектов.
Остальные свойства :
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 }
Свойства распространения позволяют создавать новый объект путем объединения свойств объекта, переданного после оператора распространения :
const items = { first, second, ...others }
items //{ first: 1, second: 2, third: 3, fourth: 4, fifth: 5 }
Асинхронная итерация
Новая конструкция for-await-of позволяет использовать асинхронный повторяющийся объект в качестве итерации цикла:
for await (const line of readLines(filePath)) {
console.log(line)
}Так как это использует ожидание , вы можете использовать его только внутри асинхронных функций, как обычный ожидающий (см. асинхронный/ожидание )
Обещание.прототип. наконец()
Когда обещание выполнено, оно успешно вызывает методы then() один за другим.
Если во время этого что-то не удается, методы then() переходят и выполняется метод catch() .
наконец() позволяет запускать некоторый код независимо от успешного или не успешного выполнения обещания:
fetch('file.json')
.then(data => data.json())
.catch(error => console.error(error))
.finally(() => console.log('finished'))Улучшения регулярных выражений
Регулярное выражение поисковых утверждений: сопоставьте строку в зависимости от того, что ей предшествует
Это взгляд в будущее: вы используете ? = для сопоставления строки, за которой следует определенная подстрока:
/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
?! выполняет обратную операцию, сопоставляя, если за строкой не следует определенная подстрока:
/Roger(?!Waters)/
/Roger(?! Waters)/.test('Roger is my dog') //true
/Roger(?! Waters)/.test('Roger Waters is a famous musician') //false
Смотрите вперед, используя ?= символ. Они уже были доступны.
Lookbehinds , новая функция, использует ?<= .
/(?<=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
Взгляд назад отрицается с помощью ? :
/(?
Свойство Unicode экранирует \p{…} и \P{…}
В шаблоне регулярного выражения вы можете использовать \d для сопоставления любой цифры, \s для сопоставления любого символа, который не является пробелом, \w для сопоставления любого буквенно-цифрового символа и так далее.
Эта новая функция расширяет эту концепцию на все символы Юникода, вводящие \p{} и его отрицание \P{} .
Любой символ unicode имеет набор свойств. Например, Скрипт определяет языковое семейство, ASCII является логическим значением, которое верно для символов ASCII, и так далее. Вы можете поместить это свойство в круглые скобки графика, и регулярное выражение проверит, верно ли это:
/^\p{ASCII}+$/u.test('abc') //✅
/^\p{ASCII}+$/u.test('ABC@') //✅
/^\p{ASCII}+$/u.test('ABC🙃') //❌
ASCII_Hex_Digit – это еще одно логическое свойство, которое проверяет, содержит ли строка только допустимые шестнадцатеричные цифры:
/^\p{ASCII_Hex_Digit}+$/u.test('0123456789ABCDEF') //✅
/^\p{ASCII_Hex_Digit}+$/u.test('h') //❌
Существует множество других логических свойств, которые вы просто проверяете, добавляя их имя в скобки графика, включая Прописные , Строчные , Белое пространство , Алфавитный , Смайлики и многое другое:
/^\p{Lowercase}$/u.test('h') //✅
/^\p{Uppercase}$/u.test('H') //✅
/^\p{Emoji}+$/u.test('H') //❌
/^\p{Emoji}+$/u.test('🙃🙃') //✅
В дополнение к этим двоичным свойствам вы можете проверить любое из свойств символов юникода на соответствие определенному значению. В этом примере я проверяю, написана ли строка греческим или латинским алфавитом:
/^\p{Script=Greek}+$/u.test('ελληνικά') //✅
/^\p{Script=Latin}+$/u.test('hey') //✅
Узнайте больше обо всех свойствах, которые вы можете использовать непосредственно в предложении .
Именованные группы захвата
В 2018 году группе захвата может быть присвоено имя, а не просто место в массиве результатов:
const re = /(?\d{4})-(? \d{2})-(? \d{2})/ const result = re.exec('2015-01-02') // result.groups.year === '2015'; // result.groups.month === '01'; // result.groups.day === '02';
Флаг s для регулярных выражений
Флаг s , сокращенный от однострочный , вызывает . чтобы также соответствовать символам новой строки. Без этого, точка соответствует обычным символам, но не новой строке:
/hi.welcome/.test('hi\nwelcome') // false
/hi.welcome/s.test('hi\nwelcome') // trueОригинал: “https://flaviocopes.com/es2018/”