Как стать автором
Обновить

Комментарии 29

Интересно, что команда JavaScript решила использовать #

"Интересно" - это эвфемизм?

Это фича из ES2021, поэтому уже везде доступно, а ES2022 будет принят в стандарт летом, поэтому пока только под флагом работает или через полифилы.
Из не указанного в статье, еще будет добавлен модификатор d для regexp, метод hasOwn, который можно использовать вместо in, может еще что-то

Цепочки ошибок - очень хорошо. А вот аваэйтами вне функций - как то спорно. Смысл авейта внутри ф-ции как раз и состоит в том, интерпретатор может выйти из неё и продолжить работу основного кода. А если авейт встретится в основном коде - застопорится всё наглухо, или как?

По идее, интерпретатор просто закончит текущую итерацию 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() выглядит как костыль

Да и # выглядит как костыль

js выглядит как костыль

обычный синтактический сахар

[-1] — синтаксический сахар, а at() — костыль

Да, могли бы завезти: [-1], [1:3], [-1:] и т.д.

1-е сломало бы обратную совместимость.

скажите 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.

всё верно можно и в топ уровне , там не только же про веб, но и про nodejs

Ключевое слово private было бы намного читабельнее.

Есть даже FAQ от tc39 почему # вместо 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 будет уже избыточным.

Ещё интересно, во что будут транслироваться private-поля из TypeScript. Будет ли к ним добавляться #. И если да, то не сломает ли это ничего.

UPD: этот вопрос подробно рассмотрен здесь. TLDR: не будет. То есть фактически будет два типа private: # и старый.

Почему нельзя индексы массивов сделать как в питоне? Очень удобно же имхо

Столько костылей, уже браузерам пора переходить на новый язык, и испортить файлы в новом расширении

Вот глупые браузеры, ну не пришло им в голову ещё сделать язык без костылей. Может подскажешь им?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории