О, 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.
Я считаю, что с этими функциями мы могли бы создавать гораздо более мощное и выразительное программное обеспечение.