Как узнать о последних предложениях ES

ECMAScript 6

Еще не закончили изучение ES6? Теперь спецификация вышла на ES10 (ES2019)! Прочитав эту статью, я буду болтать и смеяться в кругу передовых развлечений.

Цель статьи

Эта статья призвана познакомить вас с последними разработками в ES, включая функции, которые были включены в стандарт, и предложениями, которые в настоящее время находятся в разработке, а также освоить способность к самостоятельному обучению. Для удобства изучения и использования в данной статье также приведены следующие способы (см. приложение):

  1. Последние стандарты и предложения ES
  2. Отчет о реализации ядра браузера о новых возможностях
  3. Насколько хорошо двигатель V8 реализует новые функции
  4. Насколько хорошо Node реализует новые функции

Терминология и отношения

  • ECMAScript
    ECMAScript — это языковой стандарт (спецификация языка) JavasSript, это документ. В нем описаны возможности, API (включая открытые внешние API и внутренние API) и основные этапы реализации, которые должен иметь язык JS. В настоящее время наиболее распространенным стандартом является ES6 (2015 г.), а последним стандартом является ES10. Для будущих стандартов ES они вместе называются ESNext, что означает стандарт ES следующего поколения после текущего времени.

  • Связь между ECMAScript и Javascript
    ECMAScript для JS — это то же самое, что C99 для C. JS — это конкретная реализация ECMA.

  • Связь V8 с узлом
    V8 — это языковой движок, написанный в соответствии со спецификацией ECMAScript, который может выполнять код JS. Встроенный движок Node — V8, а внешний уровень — Libuv, библиотека асинхронного ввода-вывода.

  • Proposal
    Это предложение по описанию функций, которое сообщество JS надеется добавить в будущем. После нескольких обзорных ссылок он официально включен в стандарт ECMA и в будущем будет реализован движками JS различных производителей.

  • TC39
    В комитет, разработавший ECMAScript, вошли многие производители браузеров.

О предложении

Предложения разделены на шесть состояний/этапов, которые подробно описаны здесь.The TC39 Process:

  1. Этап 0/Соломенная личность Предварительные идеи
  2. Этап 1/Предложение Были включены описания API, примеры использования, основные проблемы и т. д. Комитет (tc39) заинтересован и назначает Чемпиона.
  3. Этап 2/Черновик Описанное каноническим образом, комитет надеется реализовать.
  4. Этап 3/Кандидат дальнейшее улучшение.
  5. Этап 4/Завершен Он был завершен и будет официально выпущен в следующем издании стандарта.
  6. Неактивный Это не стандартный процесс, но в предложении tc39 он классифицируется как отклоненное или отозванное предложение.

Актуальное предложение можно найти по адресуGitHub - tc39/proposals: Tracking ECMAScript ProposalsПолучать. Среди них предложения, выходящие на этап 2, с большей вероятностью будут окончательно реализованы. Обратите внимание, что в готовой таблице есть столбец «Ожидаемый год публикации», некоторые из которых были выпущены, например, свойства Rest/Spread, Promise.prototype.finally.

Конечно, возможность его использования зависит от реализации движков, таких как V8 (некоторые нестабильные функции могут быть включены с помощью флага гармонии).Как правило, когда предложение переходит на более поздний этап, предлагающий или сообщество предлагают решение полифилла. , который можно найти на github предложения. Проверьте полифилл на складе или используйте плагин babel, чтобы опробовать его заранее.GitHub - babel/proposals: ✍️ Отслеживание статуса реализации Babel предложений TC39 (может быть устаревшим).

После входа в этап 4 тестовые примеры, написанные в рамках предложения, будут объединены в тест 262, а движок Js сможет реализовать функцию и подтвердить способность с помощью тестовых примеров.Как правило, новые поддерживаемые функции будут включены в документ о выпуске. Возьмем, к примеру, поддержку Promise.prototype.finally небольшим движком QuickJs:

Пример использования test262 для Promise.prototype.finally:

Инструкции для test262 в документации QuickJs:

Promise.prototype.finally реализует запись:

static const JSCFunctionListEntry js_promise_proto_funcs[] = {
    JS_CFUNC_DEF("then", 2, js_promise_then ),
    JS_CFUNC_DEF("catch", 1, js_promise_catch ),
    JS_CFUNC_DEF("finally", 1, js_promise_finally ),
    JS_PROP_STRING_DEF("[Symbol.toStringTag]", "Promise", JS_PROP_CONFIGURABLE ),
};

Отчет об испытаниях, полученный QuickJs:

Покрытие test262 каждым движком JS находится вTest262 ReportЕсть полный отчет.

Основное направление развития

Многие функции начиная с ES6Список новых функций ES6, ES7, ES8, ES9, ES10 - NuggetsВидно, что области с более плотными предложениями:

  • Объектно-ориентированный: включая создание объектов, наследование объектов, частные переменные, декораторы, статические методы и т. д.
  • Асинхронный: включая Promise, Async, for-await-of и т. д.
  • Операции с памятью: включая ArrayBuffer, SharedArrayBuffer, Atomics и т. д.
  • Метапрограммирование: включая Reflect, Proxy, Object.values ​​и т. д.
  • Механизм модуля: включая импорт\экспорт, import(), ожидание верхнего уровня и т.д.

Перечислены практические характеристики

Цель этой статьи не в том, чтобы перечислить точки знаний. Последние функции здесь специально не представлены. Только некоторые из них, которые автор считает более практичными от ES6 до последнего предложения, которые могут повлиять на наши текущие общие методы написания. , можно переписать для получения очевидных преимуществ.

Обещание/асинхронность — MVP достается этому дуэту

Довольно зрелая, самая влиятельная черта последних лет. По поводу его понимания автор выдержки из V2exописание проблемы, есть много заблуждений:

Promise — это, по сути, механизм цикла событий.JS добавляет очередь заданий обещания в исходную очередь задач.Каждый раз, когда используется цикл событий, он сначала просматривает очередь заданий, а затем просматривает очередь задач после ее очистки.

Генератор — это сопрограмма в JS, которая помечает выход в функции, сохраняет контекст выполнения функции при встрече с этим фрагментом кода, выпрыгивает из текущей функции для выполнения следующей функции и восстанавливает последнюю сохраненную сцену выполнения функции при следующем ручном выполнении. . Таким образом, после выполнения системного вызова во время операции ввода-вывода сцена сохраняется, а процессор освобождается для других блоков кода, и он будет выполняться, когда вызов будет завершен и скопирован в пространство приложения.

async\await заключается в использовании Promise для инкапсуляции генератора для реализации автоматического next.По сути, обратный вызов выполняется после завершения операции ввода-вывода.

Деструктуризация объектов и массивов — значительно уменьшает размер кода

Я считаю, что большинство людей будут использовать его, вот только два момента:

  1. Новое предложение уже позволяет использовать параметр сброса при деструктуризации.
  2. Присвоение деструктуризации может быть выполнено после объявления:let name = ''; ({name} = {name:"otisqzhang"});

Array.prototype.includes — избавиться от уродливого indexOf(xx)!==-1

Включает может определить, существует ли элемент, возвращая логическое значение вместо позиции индекса. В прошлом indexOf(xx)!==-1, который был написан для того, чтобы судить, есть он или нет, можно было бы написать более элегантно.

Необязательная цепочка — лекарство от Uncaught TypeError

Вы, должно быть, написали много aa.bb && aa.bb.cc и т. д., чтобы использовать короткие замыкания, чтобы быть совместимыми с потенциальнымиUncaught TypeError: Cannot read property 'xx' of undefinedошибка. Предложение по опциональной цепочке вступило в завершающую стадию, и его планируется выпустить в 2020 году. готов использоватьaa?.bb?.ccМетод письма более ароматен в сочетании с оператором слияния Nullish.

Есть также немало полезных функций, таких как for-await-of, Promise.finally и т. д., вот лишь несколько примеров.

больше способов

Узнать о предложении

Последнее предложение:GitHub - tc39/proposals: Tracking ECMAScript Proposals

понять стандарт

понять реализацию

Самая полная таблица функций (включая Babel, браузер, узел и т. д.):ECMAScript compat table

  • Уровень поддержки каждой версии узла (фактическое измерение неверно, например, promise.prototype.finally, в V8 5.8+ он поддерживает использование флага гармонии):Node.js support

  • Уровень поддержки двигателя V8:Features · V8

  • Уровень поддержки браузерного движка:Test262 Report

  • Тестирование производительности:jsperf.com/