Комментарии 29
Интересно, что команда JavaScript решила использовать #
"Интересно" - это эвфемизм?
Мои любимые:
a ||= b // вместо a || (a = b)
a &&= b // вместо a && (a = b)
a ??= b // вместо a ?? (a = b)
Цепочки ошибок - очень хорошо. А вот аваэйтами вне функций - как то спорно. Смысл авейта внутри ф-ции как раз и состоит в том, интерпретатор может выйти из неё и продолжить работу основного кода. А если авейт встретится в основном коде - застопорится всё наглухо, или как?
По идее, интерпретатор просто закончит текущую итерацию event loop и возобновит его, как только сработает событие, на котором завязан await.
Это нужно например для всяких скриптов сборки и прочих там тестов, когда вам нужно дождаться завершения асинхронной функции. Сейчас в этом случае нужно писать ещё одну асинхронную функцию, единственный смысл которой — сделать await внутри. Как бы зачем?
Я просто уже представил себе килотонны кода, написанных горекодерами, в которых десятки запросов будут авэйтится последовательно в основном потоке... Надеюсь, мне не придеться разгребать такое.
Не понял что-то... Что это за Статик блок с доступом к this?
Ага, почитал. Код инициализации Статик полей.
Тут разбор есть https://2ality.com/2021/09/class-static-block.html
Cause в обработку ошибок стоило добавить уже давно. Для полноты картины не хватает еще supressed. Но в принципе, те, кто хочет попробовать cause в текущем коде, могут воспользоваться таким workaround-ом:
try {
...
} catch (x) {
const e = new Error('My error');
e.stack+= '\nCaused by: ' + x.stack;
throw e;
}
Приватные поля доступны через babel уже давно. Единственное, babel транспайлит доступ к таким полям в адовые цепочки вызовов и время доступа серьезно возрастает. С нативной поддержкой рантайма проблема должна уйти.
Метод at() тоже выглядит удобным, правда в обычной жизни не так часто применим.
at() выглядит как костыль
del
скажите import появился без разминования для написания в одну строку?
то в vue 3 + vite requer нету , типа:
let placeholder = ref(import '/assets/placeholder.png')
или
let placeholder = ref(import from '/assets/placeholder.png')
и второй вопрос:
в общем опять же в vue 3 + vite (не знаю влияет это на ответ) сделал return array.sort() и это работает, потом задумался и вспомил что sort возвращает void и вы можете это загуглить. как это работает?
Для 3 пункта хорошо бы добавить об ограничении использования await: только на верхнем уровне модуля (в оригинальной статье "top-level await"). А то из текста получается, будто теперь его вообще везде можно писать без async.
Ключевое слово private было бы намного читабельнее.
github.com/tc39/proposal-private-fields/blob/main/FAQ.md
Если вкратце, то из-за того, что обращение к this.x неявно создает публичное поле, даже если создано приватное, то 2 основных пункта почему отказались от private:
— чтобы код на js (доступ к полям) работал так же быстро, как и до введения приватных полей, не вводя дополнительные сложности и проверки в рантайме.
— чтобы неявно не нарушать инкапсуляцию, если подкласс захочет иметь публичный x, а суперкласс имеет приватный x.
class Base {
#x = 0
getPrivateX() {
return this.#x
}
}
class Derived extends Base {
x = 1
}
const example = new Derived()
console.log(`public: ${example.x}, private: ${example.getPrivateX()}`)
> public: 1, private: 0
Также там приводят в пример, что в C# можно обойти инкапсуляцию, и единственное гарантированное решение это явно использовать синтаксис @x или #x.
И по сути, до этого негласным правилом было называть приватные поля с подчеркивания, то использование # будет просто более явным.
В итоге выбрали # методом исключения остальных вариантов, которые или не подходили, или создавали потенциальные места для ошибок программистов.
И так как они решили, что вводить # нужно обязательно по разным причинам, то использование дополнительно к этому слова private будет уже избыточным.
Почему нельзя индексы массивов сделать как в питоне? Очень удобно же имхо
Столько костылей, уже браузерам пора переходить на новый язык, и испортить файлы в новом расширении
4 важных нововведения в ES2022