Краткое предисловие для непосвященных:
— ECMAScript — это официальный стандарт языка JavaScript
— Самих стандартов много. Самый популярный — ECMA-262
— Сейчас ожидаем версию ECMAScript 6
JavaScript «пилили» за несколько дней, и в нем было очень много минусов. Тем не менее, он пробился в Web и стал стандартом в веб-программировании. Его «косяки» решили стандартизировать с помощью EcmaScript. Сейчас используется устоявшаяся версия — EcmaScript 5, и на подходе версия 6 под кодовым названием ECMAScript.next, или Harmony. Ожидается, что в итоге она принесет гармонию в разработку.
Дальше смотрим подробнее, что изменится в 6 версии, и сравниваем с тем, что было.
Блочная область видимости
В JavaScript объявление переменных происходит через зарезервированное слово var
. Эта переменная поднимает объявление сразу наверх. В стандарте EcmaScript появляется новое слово для определения переменных — let
. Оно позволяет сузить видимость этой переменной до блока. У нас есть цикл for, в нем через let
мы определяем переменную i
, и она доступна только в этом цикле. Извне она не будет доступна, но в if
- будет.Это поможет нам избавить от «замусоривания» функции переменными.
Также будут введены константы. Раньше мы создавали объект, применяли к нему Object.freeze
или называли переменную в верхнем регистре, чтобы другие разработчики это не меняли. Сейчас можем не заморачиваться и использовать зарезервированное слово const
. Оно работает как let
, имеет блочную область видимости, а попытки изменить ее приведут к ошибке.
Строковые литералы
Для повышения читабельности мы разбивали длинную строку и использовали вот такой «ад»:
Вместо этого мы можем использовать backtip
, и строка будет выглядеть так, как мы ее ввели:
Использование плейсхолдеров
Например, нам в работе нужно генерить pdf документ. Для этого есть определенный функционал, который преобразует вызов функций в элементы для наполнения документов. В работе над строками нам приходится их конкатенировать через «плюсы» или использовать сторонние бибилотеки. Теперь эта поддержка будет нативна.
Мы сможем использовать ${name}
, чтобы затем использовать определенную переменную.
Объектные литералы
В своей практике часто сталкиваюсь с необходимостью объявлять plain object
. В обновленном стандарте радует, что при объявлении функции say
, которую мы ранее писали названием функции: снова название функции
, теперь это упрощается сокращением say
.
Деструктуризация
Допустим, у нас есть массив. Чтобы выделить каждый из этих элементов, мы могли пройтись по циклам или указать пару из них по индексу.
Теперь мы можем использовать квадратные скобки, чтобы получить значение этого массива:
Также можно взять первый элемент массива, а оставшиеся записать в отдельную переменную как массив — var [one, ...rest] = arr;
. Это полезно применять в функциях.
Можем не по порядку считывать значение литерала, а проигнорировать:
Поменять содержимое переменных местами:
Возвращать несколько значений:
Также мы можем сами указать, какие свойства записать переменным. В таком случае name
— это свойство объекта:
Spread в функциях
У нас есть функция, которая соединяет некоторые значения через разделитель. Теперь таким удобным способом мы можем указать, что есть separator
, и записать это в отдельный аргумент, а через спред ... в values
получить массивом остальные значения, переданные в эту функцию.
Также мы можем внутрь функции передавать значения, используя спред. У нас есть массив, мы ставим …
и передаем внутрь функции. Спред сам распределит этот массив по аргументам.
Лямбда-выражения
Cокращенная запись для анонимных функций. Позволяет уменьшить количество кода и, по моему субъективному мнению, повышает читабельность. У нас есть объект, массив и метод для получения значения этого массива. c
в данном случае — входящий аргумент, далее мы вводим инструкции, где можем его использовать:
Функцию перевода rgb
в hex
можно переписать таким образом, используя лямбду:
Классы
Ранее нужно было объявлять методы через прототип. Теперь стало приятнее читать:
Появилось зарезервированное слово для создания функции-конструктора и геттеров/сеттеров, причем необязательно указывать сеттеру на вызов явно, можно использовать оператор присваивания.
Наследование
Через слово extends
можно указать родителя, а слово super
использовать для доступа к конструктору родителя. Через super.<METHOD_NAME>
можно вызывать родительские методы.
Модули
Ранее с модулями в JS была морока, поэтому мы использовали такие решения как RequireJS. Сейчас нам предлагают нативную поддержку:
Функции, которые мы хотим вытянуть наружу, можно обозначить через слово export, затем можно подключить через import, указав путь к модулю.
Обход значений
Появилась возможность обхода значений через for..of
Структуры
Map
- это структура, подобная обычному объекту, — ассоциативный массив. Отличия в том, что в качестве ключа можно использовать не только строки, а вообще любой тип. Плюс можно получить размер через свойство size
.
WeakMap
отличается от Map
тем, что в качестве ключа используется объект, а все ссылки на значения не блокируют GC от освобождения памяти. Иными словами, если на объект умерли все ссылки кроме той, что в WeakMap
— память все равно будет помечена на освобождение.
В Set
можно хранить значения любых типов в том порядке, в каком мы их добавляем, также можно получить размер через size
. Суть Set
в том, что значения, хранимые там, уникальны. Т.е. мы не сможем впихнуть два массива с одними и теми же элементами.
WeakSet
, подобно WeakMap
, тоже не блокирует очищение памяти, если умерли все ссылки, кроме тех, что в WeakSet
.
Итераторы
Итераторы позволяют задать свой метод обхода последовательности значений. Например, мы можем переопределить обход объекта под наши нужды:
Кстати, здесь мы используем новый тип данных «Symbol
». Он уникален и неизменяем. С его помощью мы можем, например, указать собственную функцию-итератор, как показано выше.
Также мы можем задать функцию-генератор для всё того же обхода значений. Через оператор yield
указывается, когда функция должна приостановиться, выбросив значение.
Мораль
Новые возможности можно попробовать уже сейчас. Например, в сервисе repl.it/languages/Traceur. Или же можно скачать и подключить к своему приложению разработку Google.
Советую пройтись по документации от Mozilla.
Еще полезные ссылки:
— harmony:proposals
— harmony:specification_drafts
— 2ality.com
Конечно, это не все нововведения. Я не упомянул те же Proxiesи Promises.
Некоторым могут не понравиться нововведения, некоторые встретят их с восторгом. Я же не могу сказать, что будущее для JS темное — язык развивается, приобретает новые фишки. JavaScript давно и прочно вошел в Web, и его не так-то просто оттуда изгнать :)
Я знаю одно: пока есть движение, есть жизнь, а значит, и будущее.