О, JavaScript, самый непонятый язык, но такой мощный! У него могло бы быть больше крыльев!

JavaScript — самый любимый/ненавистный язык программирования. Либо из-за его особенностей (давайте будем честными, принуждение не всегда полезно) и его гибкости, позволяющей делать все, включая ошибки.

Мы склонны видеть сумасшедшие вопросы на интервью, чтобы проверить ваши знания о смешивании принуждения и прототипов.

Однако я считаю, что у него могло бы быть больше полномочий. И это их список.

Защитное предложение сопоставления с образцом

У нас уже есть предложение по сопоставлению с образцом (ссылка). Следующий фрагмент показывает его использование.

match (res) {
  when ({ status: 200, body, ...rest }): handleData(body, rest)
  when ({ status, destination: url }) if (300 <= status && status < 400):
    handleRedirect(url)
  when ({ status: 500 }) if (!this.hasRetried): do {
    retry(req);
    this.hasRetried = true;
  }
  default: throwSomething();
}

Мы могли бы использовать это для перегрузки функций, поэтому нам не нужно создавать match case и в каждом случае выполнять другой фрагмент кода, как в предложении. (Это слишком switch case)

Это можно сделать с меньшим количеством шаблонов, разрушая значение прямо внутри определения параметров функции, например:

function login({email: email, password: password}) {
  return "You logged in"
}

Мы также можем перегрузить одну и ту же функцию, чтобы она работала в разных случаях:

function login({email: email}) {
  return "Password is required"
}
function login({password: password}) {
  return "E-mail is required"
}
function login({email: email, password: password}) {
  return "You logged in"
}

Я знаю, это сбивает с толку даже для компилятора. Это может быть запутано, как если бы мы деструктурировали параметр.
Но мы могли бы использовать подсказку, чтобы сказать, что мы собираемся сопоставить, как в предложении:

match function login({email: email, password: password}) {
  return "You logged in"
}

Трубы

Конвейер хорошо используется в F#, Elixir и других языках. Мы могли бы передавать значение другим функциям, не борясь с фигурными скобками.

Следующий код:

const user = getUser()
uploadAvatarViaLocalFile(user, "./avatar.png")
updateName(user, "anna")

Или даже этот код:

uploadAvatarViaLocalFile(getUser(), "./avatar.png")
updateName(getUser(), "anna")

Может стать таким:

const user = getUser()
  |> uploadAvatarViaLocalFile("./avatar.png")
  |> updateName("anna")

Это легче читать. У нас также есть предложение для него и плагин для Babel. Но если бы он приземлился, мы могли бы сделать более выразительный код. Легко.

неизменность

Одной из основных причин его силы и неправильного понимания является его слабая типизация и изменчивые характеристики.

Но давайте будем честными, иногда нам нужны неизменяемые данные. Мы можем добиться этого с помощью нескольких подходов, либо с помощью библиотек, либо с помощью прокси-серверов и т. д.

Оно может быть нативным и может идти рука об руку с ключевым словом const. Примитивы с тегом const должны быть неизменяемыми, даже вложенными:

const user = {
  name: "Anna",
  age: 21,
  hobbies: ["play piano", "sing", "walk"]
}

user.name = "Bob" // this shouldn't work
user.hobbies = [] // this shouldn't work

user.hobbies.push("code") // this should work

Подведение итогов

Функции, которые я перечислил здесь, больше связаны с функциональным программированием. Что хорошо сочетается с выразительностью JavaScript.

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