Технический комитет 39 (TC39) — это группа экспертов по JavaScript, которые работают над стандартизацией ECMAScript.
Рабочий процесс TC39 состоит из нескольких этапов:
- Этап 0 (Идея): прием входных данных для спецификации.
- Этап 1 (Предложение): предложение для рассмотрения высокоуровнего API.
- Этап 2 (Черновик): точное описание синтаксиса и семантики с использованием формального языка спецификаций.
- Этап 3 (Кандидат): назначенные рецензенты подписывают текущий текст спецификации.
- Этап 4 (Завершение): дополнение готово к включению в формальный стандарт ECMAScript.
После этапа 4 предложения будут включены в следующую редакцию ECMAScript. Когда спецификация проходит ежегодную ратификацию в качестве стандарта, предложение утверждается.
Начиная с ES2015, в ECMAScript было введено много новых синтаксисов и функций. В статье представлены четыре из них: **
, ??
, ?.
, и |>
.
Оператор возведения в степень
Оператор возведения в степень **
— это вычислительный оператор, используемый в формате var1 ** var2
. Он возвращает var1
в степени var2
, что равносильно Math.pow
, но в качестве операндов также можно использовать BigInt
.
**
находится в стандарте ES2016.
Примеры:
console.log(2 ** 3); // 8
console.log(4 ** 1/2); // 2
console.log(2 ** -1); // 0.5
console.log(7 ** 1); // 7
console.log(8 ** 0); // 1
console.log(NaN ** 1); // NaN (не число)
console.log(2 ** 3 ** 3); // 134217728
/* глобальные BigInt */
console.log(BigInt('2') ** BigInt('3')); // 8n
console.log(BigInt('2') ** 3) // Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions (Непойманная TypeError: не удается смешать BigInt и другие типы, используйте явные преобразования
Оператор возведения в степень является правоассоциативным: a ** b ** c
равно a ** (b ** c)
.
Строка 7 эквивалентна 2 ** (3 ** 3)
.
BigInt
есть в ES2020, поэтому ESLint не поддерживает его по умолчанию, хотя поставляется в браузерах. Без комментария в строке 8 он покажет ошибку “'BigInt' is not defined”)
(BigInt неопределен). Комментарий сообщает ESLint, что BigInt
является глобальной переменной. Поэтому не используйте правило no-undef
для предупреждения.
Строка 10 выдает ошибку: “Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions”
(Непойманная TypeError: не удается смешать BigInt и другие типы, используйте явные преобразования).
Ниже приведена таблица совместимости браузеров:
Оператор нулевого слияния
Оператор нулевого слияния ??
— это логический оператор, используемый в формате leftExpr ?? rightxpr
. Если значение leftExpr
равно null
или undefined
, оно возвращает значение rightExpr
, в противном случае — leftExpr
.
??
есть в ES2020.
Это усовершенствование логического оператора ИЛИ (||
), который используется в виде leftExpr || rightExpr
. Когда leftExpr
является ложным, ||
возвращает rightExpr
, противном случае — leftExpr
. Иногда выражение неожиданно возвращает rightExpr
, когда leftExpr
ложно, например false
, ‘’
, или 0
.
Примеры:
let a = null;
console.log(a ?? 1); // 1
console.log(a || 1); // 1
let b;
console.log(b ?? 'x'); // x
console.log(b || 'x'); // x
let c = 0;
console.log(c ?? 1); // 0
console.log(c || 1); // 1
let d = false;
console.log(d ?? 'x'); // false
console.log(d || 'x'); // x
Таблица совместимости:
Оператор опциональной последовательности
Оператор опциональной последовательности ?.
— это синтаксический сахар для сокращенного вычисления булевых выраженийс возвращаемым undefined
, если цепочка объектов имеет нулевую(null
или undefined
) ссылку в середине.
?.
есть в ES2020.
a?.b
эквивалентно a && a.b
.
Такие операторы можно отправить в стэк, чтобы сделать код короче.
a?.b?.c?.d?.e
эквивалентно a && a.b && a.b.c && a.b.c.d && a.b.c.d.e
.
Опциональная последовательность может использоваться для объекта, функции или массива.
Примеры:
let obj = {
a: {
b: {
c: 1,
},
},
f: {
s: () => "x",
u: (c) => (c ?? 0) + 1,
},
}
console.log(obj.a.b.c); // 1
console.log(obj.a.x.c); // Uncaught TypeError: Cannot read property 'c' of undefined (Непойманная TypeError: не удается прочитать свойство 'c' у типа undefined)
console.log(obj.a.x?.c); // undefined
console.log(obj.f.s); // () => "x"
console.log(obj.f.t); // undefined
console.log(obj.f.s()); // x
console.log(obj.f.t()); // Uncaught TypeError: obj.f.t is not a function (Непойманная TypeError: obj.f.t - не функция)
console.log(obj.f.t?.()); // undefined
console.log(obj.f.u(5)); // 6
console.log(obj.f.u()); // 1
console.log(obj.d?.[100]); // undefined
console.log(obj?.a?.b?.c); // 1
Таблица совместимости:
Конвейерный оператор
Конвейерный оператор |>
— это синтаксический сахар, используемый в формате выражение |> функция
. Он создает цепные вызовы функций в удобочитаемом виде.
|>
находится в стадии 1 TC39.
значение |> функция1 |> функция2 |> функция3 |> функция4 |> функция5
это эквивалент функция5(функция4(функция3(функция2(функция1(значение))))).
Примеры:
const double = (n) => n * 2;
const triple = (n) => n * 3;
const quadruple = (n) => n * 4;
const quintuple = (n) => n * 5;
console.log(5 |> double); // 10
console.log(5 |> double |> triple; // 30
console.log(5 |> double |> triple |> quadruple); // 120
console.log(5 |> double |> triple |> quadruple |> quintuple); // 600
Более продвинутые примеры. Их стоит прочитать. Пока вы не можете их запустить. Это экспериментальные функции и поддержки браузеров еще нет.
Вывод
Языки программирования эволюционируют с течением времени. Интересно наблюдать, как они улучшаются, становясь более краткими и мощными.
Спасибо за чтение.
Читайте также:
- Сравниваем WebGL-фреймворки Three.js и Babylon.js
- Креативное программирование: методы и инструменты для JavaScript, Python и других языков
- Сравнение производительности JS-фреймворков на RealWorld Demo
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Jennifer Fu: The 4 Newest JavaScript Operations: An Introduction