![image](https://habrastorage.org/files/89e/3de/31c/89e3de31c8a5477192e5f762b4845139.jpg)
ES6 повествует о тонкостях языка, малознакомых большинству работающих на JavaScript программистов. Вооружившись этими знаниями, вы достигнете подлинного мастерства; выучите новый синтаксис; научитесь корректно использовать итераторы, генераторы, модули и классы; сможете более эффективно работать с данными; познакомитесь с новыми API, например Array, Object, Math, Number и String; расширите функционал программ с помощью мета-программирования.
Цели и задачи
Если вы склонны заносить в черный список все, что в JavaScript кажется странным или непонятным (а некоторые привыкли поступать именно так), в какой-то момент от богатого возможностями языка у вас останется лишь пустая оболочка.
Такое доступное всем подмножество механизмов JavaScript принято считать сильными сторонами этого языка, но правильнее назвать это легкими в освоении, безопасными или даже минимальными возможностями.
Я (автор) предлагаю вам поступить наоборот: досконально изучить JavaScript, чтобы понять даже самые сложные его особенности. Именно о них пойдет речь в этой книге.
Мне известна склонность JS-разработчиков изучать лишь минимум, необходимый для решения конкретной задачи, но в моей книге вы не встретите распространенной рекомендации избегать сложностей.
Даже если что-то работает нужным мне образом, я не готов удовлетвориться самим этим фактом — мне важно понять, почему и как оно работает. Хотелось бы, чтобы вы разделили мой подход. Я ненавязчиво зову вас пройти по тернистой дороге, которой мало кто ходил, и полностью осмыслить, что представляет собой язык JavaScript и какие возможности он дает. И когда вы будете обладать этими знаниями, ни одна техника, ни одна платформа, ни один новый подход не окажутся за пределами вашего понимания.
Каждая из книг серии You Don’t Know JS глубоко и исчерпывающе раскрывает конкретные ключевые элементы языка, которые зачастую толкуются неверно или поверхностно. После прочтения этой литературы вы получите твердую уверенность в том, что понимаете не только теоретические, но и практические нюансы.
Те познания в JavaScript, что у вас есть, скорее всего, вы получили от людей, которые сами попали в ловушку недостаточного понимания. Это всего лишь тень того, чем JavaScript является на самом деле. Вы еще толком не знаете его, но книги серии You Don’t Know JS помогут вам наверстать упущенное. Поэтому вперед, дорогие друзья, язык JavaScript ждет вас!
ES: современность и будущее
Для чтения этой книги вы должны хорошо владеть языком JavaScript вплоть до последнего (на момент написания книги) стандарта, который называется ES5 (точнее, ES5.1), поскольку мы с вами будем рассматривать новый стандарт ES6, попутно пытаясь понять, какие перспективы ждут JS.
• Up & Going: Вы только начинаете изучать программирование и JS? Перед вами карта, которая поможет вам в путешествии по новой области знаний.
• Scope & Closures: Известно ли вам, что в основе лексического контекста JS лежит семантика компилятора (а не интерпретатора)? Можете ли вы объяснить, каким образом замыкания являются прямым результатом лексической области видимости и функций как значений?
• this & Object Prototypes: Можете ли вы назвать четыре варианта значения ключевого слова this в зависимости от контекста вызова? Приходилось ли вам путаться в псевдоклассах JS, вместо того чтобы воспользоваться более простым шаблоном проектирования behavior delegation? А слышали ли вы когда-нибудь про объекты, связанные с другими объектами (OLOO)?
• Types & Grammar: Знакомы ли вы со встроенными типами в JS и, что более важно, знаете ли способы корректного и безопасного приведения типов? Насколько уверенно вы разбираетесь в нюансах грамматики и синтаксиса этого языка?
• Async & Performance: Вы все еще используете обратные вызовы для управления асинхронными действиями? А можете ли вы объяснить, что такое объект promise и как он позволяет избежать ситуации, когда каждая фоновая операция возвращает свой результат (или ошибку) в обратном вызове? Знаете ли вы, как с помощью генераторов улучшить читабельность асинхронного кода? Наконец, известно ли вам, что представляет собой полноценная оптимизация JS-программ и отдельных операций?
Если вы уже прочитали все эти книги и освоили рассматриваемые там темы, значит, пришло время погрузиться в эволюцию языка JS и исследовать перемены, которые ждут нас как в ближайшее время, так и в отдаленной перспективе.
В отличие от предыдущего стандарта, ES6 нельзя назвать еще одним скромным набором добавленных к языку API. Он принес с собой множество новых синтаксических форм, и к некоторым из них, вполне возможно, будет не так-то просто привыкнуть. Появились также новые структуры и новые вспомогательные модули API для различных типов данных.
ES6 — это шаг далеко вперед. Даже если вы считаете, что хорошо знаете JS стандарта ES5, вы столкнетесь с множеством незнакомых вещей, так что будьте готовы! В книге рассмотрены все основные нововведения ES6, без которых невозможно войти в курс дела, а также дан краткий обзор планируемых функций — о них имеет смысл знать уже сейчас.
Поддержка версий
Стандарт JavaScript официально называется ECMAScript (или сокращенно ES), и до недавнего времени все его версии обозначались только целыми числами. ES1 и ES2 не получили известности и массовой реализации. Первой широко распространившейся основой для JavaScript стал ES3 — стандарт этого языка для браузеров Internet Explorer с 6-й по 8-ю версию и для мобильных браузеров Android 2.x. По политическим причинам, о которых я умолчу, злополучная версия ES4 так и не увидела света.
В 2009 году был официально завершен ES5 (ES5.1 появился в 2011-м), получивший распространение в качестве стандарта для множества современных браузеров, таких как Firefox, Chrome, Opera, Safari и др.
Следующая версия JS (появление которой было перенесено с 2013-го сначала на 2014-й, а затем на 2015 год) в обсуждениях фигурировала под очевидным именем ES6. Но позднее стали поступать предложения перейти к схеме именования, основанной на годе выхода очередной версии, например ES2016 (она же ES7), которая будет закончена до конца 2016 года. Согласны с таким подходом далеко не все, но есть вероятность, что стандарт ES6 станет известен пользователям под названием ES2015. А появление версии ES2016 станет свидетельством окончательного перехода на новую схему именования.
Кроме того, было отмечено, что скорость эволюции JS превышает одну версию в год. Как только в обсуждениях стандарта возникает новая идея, разработчики браузеров предлагают прототипы нового функционала, а программисты-первопроходцы принимаются экспериментировать с кодом.
Обычно задолго до официального одобрения новый функционал становится стандартом де-факто благодаря ранним прототипам движка и инструментария. Соответственно, имеет смысл рассматривать будущие версии JS как связанные с появлением нового функционала, а не с произвольным набором основных особенностей (как делается сейчас) или с годом (как планируется).
В этом случае номер версии перестает иметь ту важность, которой обладал раньше, а JavaScript превращается в живой, постоянно меняющийся стандарт. И лучше не говорить о коде как о «написанном в соответствии с таким-то стандартом», а рассматривать его в зависимости от поддерживаемых функциональных особенностейподдерживаемых функциональных особенностей.
Транскомпиляция
Быстрая эволюция функционала ставит серьезную проблему перед разработчиками, желающими использовать новые возможности в ситуации, когда их сайты или приложения работают в более старых браузерах, не поддерживающих нововведения.
По всей видимости, ES5 не прижился во многих местах, потому что в основном базу кода не приводили в соответствие с новым стандартом до тех пор, пока не прекратилась поддержка большинства, если не всех, предшествующих платформ. В результате многие разработчики только недавно начали пользоваться такими вещами, как, к примеру, строгий режим, появившийся в ES5 более пяти лет назад.
Подобные многолетние промедления повсеместно считаются вредными для будущего экосистемы JS. Люди, занимающиеся развитием языка, мечтают, чтобы разработчики начинали создавать код с учетом новых функциональных особенностей и шаблонов, сразу же после того, как будет утверждена спецификация, и браузеры смогут все это реализовывать.
Как же разрешить противоречие? Здесь на помощь приходят специальные инструменты, в частности техника транскомпиляции2. Грубо говоря, вы посредством специального инструмента преобразуете код ES6 в эквивалент (или нечто близкое к таковому), работающий в окружениях ES5.
В качестве примера возьмем сокращенные определения свойства (см. раздел «Расширения объектных литералов» в главе 2). Вот как это делается в ES6:
var foo = [1,2,3];
var obj = {
foo // означает 'foo: foo'
};
obj.foo; // [1,2,3]
А вот каким образом (примерно) он транскомпилируется:
var foo = [1,2,3];
var obj = {
foo: foo
};
obj.foo; // [1,2,3]
Такое небольшое, но удобное преобразование позволяет в случае одинаковых имен сократить объявление объектного литерала foo: foo до foo. Действия транскомпилятора в этом случае представляют собой встроенный рабочий процесс, аналогичный линтингу, минификации и другим подобным операциям.
Библиотеки Shim (полизаполнения)
Далеко не всем новым функциональным особенностям ES6 требуется транскомпилятор. Полизаполнения (polyfills), которые также называют библиотеками Shim, представляют собой шаблоны для определения поведений из новой среды для более старых сред. В синтаксисе полизаполнения недопустимы, но для различных API их вполне можно использовать.
Давайте рассмотрим новый метод Object.is(..), предназначенный для проверки строгой эквивалентности двух значений, но без подробных исключений, которые есть у оператора === для значений NaN и -0. Полизаполнение для метода Object.is(..) создается очень просто:
if (!Object.is) {
Object.is = function(v1, v2) {
// проверка для значения '-0'
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2;
}
// проверка для значения 'NaN'
if (v1 !== v1) {
return v2 !== v2;
}
// все остальное
return v1 === v2;
};
}
Есть замечательная коллекция ES6 Shim, которую стоит включать во все новые JS-проекты.
Предполагается, что JS ждет непрерывное развитие и что поддержка в браузерах новых функций будет реализовываться постепенно по мере их появления, а не большими фрагментами. Так что самая лучшая стратегия сохранения актуальности — это добавление в базу кода полизаполнений, включение транскомпиляции в процесс сборки и постоянная готовность самого разработчика к изменениям.
Те же, кто мыслит консервативно и откладывает использование нового функционала, пока не исчезнут все работающие без него браузеры, всегда будут плестись далеко позади. Их обойдут стороной все инновации, позволяющие сделать написание кода на JavaScript более результативным, рациональным и надежным.
Подводим итоги
На момент написания книги стандарт ES6 только появился, поэтому вам предстоит многому научиться. Однако куда важнее перестроить свое мировоззрение в соответствии с новым вариантом развития языка JavaScript. Обыкновение годами ждать официальных документов, одобряющих смену стандарта, должно остаться в прошлом.
Теперь новые функциональные особенности JavaScript сразу же после своего появления реализуются в браузерах, и только от вас зависит, начнете вы пользоваться ими немедленно или же продолжите действовать неэффективно в попытках запрыгнуть в уходящий поезд. Неважно, какие еще формы примет JavaScript, — теперь это будет происходить быстрее, чем когда-либо в прошлом. Транскомпиляторы и полизаполнения — вот инструменты, которые позволят вам все время оставаться на переднем крае развития языка.
Вы должны принять новую реальность JavaScript, где разработчикам настоятельно рекомендуется перейти от выжидания к активной позиции. А начнется все с изучения ES6
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — ES6
Only registered users can participate in poll. Log in, please.
Издательство будет благодарно за обратную связь по поводу целесообразности перевода всей серии книг (или нескольких). Нужно ли издать всю серию?
56.04% 1. Нужно каждую книгу по отдельности167
39.6% 2. Все в одном томе118
4.36% 3. Не нужно13
298 users voted. 55 users abstained.