Что нового планируется в JavaScript на 2019 год

От автора: в течение последних нескольких лет JavaScript постоянно развивался благодаря новым функциям. Если вам интересно узнать, что ждет нас в следующей версии JavaScript 2019, этот пост для вас!

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

Процесс введения новых функций языка JavaScript

Если коротко, спецификация языка, которая управляет JavaScript, называется ECMAScript. Группа Ecma International, которая рассматривает и принимает изменения в спецификации языка — Технический комитет 39 или TC39. Изменения в спецификации ECMAScript проходят стандартизированный процесс, включающий этапы.

Этап 0: идеи

Этап 1: официальные предложения

Этап 2: проекты

Этап 3: кандидаты

Этап 4: утверждено

Пока функция языка не достигнет стадии 4, нет никаких гарантий, что она станет частью официальной спецификации языка ECMAScript. Однако реализации движка JavaScript, такие как V8 (используется Chrome и Node.js) и Firefox SpiderMonkey, могут добавлять экспериментальную поддержку предложенных функций до достижения 4-го уровня, чтобы разработчики могли тестировать и предоставлять обратную связь.

Текущие кандидаты ES2019

На момент написания этой статьи новых предложений ТК39 на Этапе 4 не было. Однако есть несколько кандидатов на Этапе 3.

Отказ от ответственности: поскольку они являются кандидатами на Этапе 3, окончательная спецификация языка ES2019 может не включать все эти предложения. Фактически, некоторые из этих предложений рассматриваются годами. Кроме того, окончательные реализации могут выглядеть или вести себя иначе, чем текущие кандидаты.

Изменения в классах JavaScript

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

class Truck extends Automobile {
model = "Heavy Duty"; // объявление публичного поля
#numberOfSeats#numberOfSeats = 5; // объявление частного поля
#isCrewCab#isCrewCab = true;
static #name#name = "Truck"; // объявление статического частного поля

// статический метод
static formattedName() {
// Обратите внимание, что имя класса Truck используется,
// чтобы получать доступ к статическому полю вместо "this"
return `This vehicle is a ${ Truck.#name#name }.`;
}

constructor( model, seats = 2 ) {
super();
this.seats = seats;
}

// Частный метод
#getBodyType()#getBodyType() {
return this.#isCrewCab#isCrewCab ? "Crew Cab" : "Standard Cab";
}

bodyType() {
return `${ this.#numberOfSeats#numberOfSeats }-passenger ${ this.model } ${ this.#getBodyType()#getBodyType() }`;
}

get seats() { return this.#numberOfSeats;#numberOfSeats; }
set seats( value ) {
if ( value >= 1 && value < 7 ) {
this.#numberOfSeats#numberOfSeats = value;
this.#isCrewCab#isCrewCab = value > 3;
}
}
}

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

trimStart() и trimEnd() для строк

Тип String имеет метод trim(), который удаляет пробел как с начала, так и с конца строки. Предложенные методы trimStart() и trimEnd() позволят дополнительно контролировать удаление пробелов.

const one = " hello and let ";
const two = "us begin. ";
console.log( one.trimStart() + two.trimEnd() ) // "hello and let us begin."

Интересная деталь — эта функция уже реализована во многих движках JavaScript. Это один из многих случаев, когда браузеры помогают продвигать язык.

Большие числа с помощью BigInt

Мы можем увидеть примитив BigInt для целых чисел, превышающих текущее максимальное значение 253. A BigIntможет быть объявлено несколькими различными способами.

// для ссылок
const theBiggestIntegerToday = Number.MAX_SAFE_INTEGER; // 9007199254740991

// для объявления BigInt используется синтаксис 'n'
const ABiggerInteger = 9100000000000001n;

// используется конструктор BigInt()
const EvenBigger = BigInt( 9100000000000002 ); // 9100000000000002n

// используется конструктор BigInt() со строкой
const SuchBigWow = BigInt( "9100000000000003" ); // 9100000000000003n

Узнайте больше о случаях использования и ошибках BigInt.

Сглаживание массивов с помощью flat() и flatMap()

Если вы изучали функциональное программирование, вы можете знать о flat() и flatMap(). flat() предназначен для получения массива значений, когда некоторые из этих значений могут быть больше массивов, и возвращает новый одномерный массив.

const nestedArraysOhMy = [ "a", ["b", "c"], ["d", ["e", "f"]]];
// .flat() принимает необязательный аргумент глубины
const ahhThatsBetter = nestedArraysOhMy.flat( 2 );
console.log( ahhThatsBetter ); // [ "a", "b", "c", "d", "e", "f" ]

flatMap() аналогичен map(), но обратный вызов может возвращать массив, и конечный результат будет сглаживать одномерный массив вместо вложенных массивов.

const scattered = [ "my favorite", "hamburger", "is a", "chicken sandwich" ];

// стандартный результат map() во вложенном массиве
const huh = scattered.map( chunk => chunk.split( " " ) );
console.log( huh ); // [ [ "my", "favorite" ], [ "hamburger" ], [ "is", "a" ], [ "chicken", "sandwich" ] ]

// flatMap() конкатенирует возвращенные массивы
const better = scattered.flatMap( chunk => chunk.split( " " ) );
console.log( better ); // [ "my", "favorite", "hamburger", "is", "a", "chicken", "sandwich" ]

Другие предлагаемые кандидаты ES2019

Вот список дополнительных кандидатов на Стадию 3 на момент написания этой статьи.

Стандартизированный объект globalThis

Динамический import()

Функции Наследования RegExp

import.meta

Строка matchAll()

Object.fromEntries()

Хорошо сформированный JSON.stringify

Стандартизированный Hashbang для приложений с интерфейсом командной строки (CLI)

Когда ожидать ES2019

В течение последних нескольких лет TC39 последовательно выпускала новые редакции спецификации языка ECMA-262 ECMAScript в июне. Очень вероятно, что мы увидим спецификацию ES2019 в июне этого года.

Попробуйте возможности ES2019 сегодня

Некоторые из предложенных функций языка уже доступны в движках и утилитах JavaScript. Эти новые функции иногда отключаются по умолчанию, но их можно включить с помощью конфигурации.

Протестируйте последнюю версию Node.js

Node.js использует движок Chrome V8 JavaScript. Некоторые из кандидатов могут быть использованы в последней версии Node.js, потому что V8 уже поддерживает их (например, Array.prototype.flat и String.prototype.trimEnd).

Вы можете включить другие функции языка, используя параметры командной строки —harmony-{feature-flag}. Чтобы увидеть, какие флаги поддерживает ваша версия Node.js, используйте параметр —v8-options, чтобы получить их список. Некоторые из кандидатов помечены как «в процессе».

macOS / Linux

node --v8-options | grep "in progress"

Windows

node --v8-options | find "in progress"

Например, чтобы запустить приложение Node.js, которое содержит класс, который использует объявления полей и статические методы, вы можете использовать следующие параметры CLI.

node --harmony-class-fields --harmony-static-fields index.js

Тестирование с Babel 7.0+

Babel — это утилита JavaScript, которая позволяет использовать новейшие функции языка, которые еще могут не поддерживаться во всех браузерах и средах. Когда вы пишете «современный» JavaScript, Babel переводит ваш код в эквивалентный синтаксис, совместимый со старыми движками.

Babel поддерживает функции экспериментального языка с помощью плагинов. Babel ведет список поддерживаемых предложений ECMAScript в своем официальном репозитории.

Автор: David Neal