Введение: 4 новейших операции JavaScript

Технический комитет 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

Более продвинутые примеры. Их стоит прочитать. Пока вы не можете их запустить. Это экспериментальные функции и поддержки браузеров еще нет.

Вывод

Языки программирования эволюционируют с течением времени. Интересно наблюдать, как они улучшаются, становясь более краткими и мощными.

Спасибо за чтение.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Jennifer Fu: The 4 Newest JavaScript Operations: An Introduction