ES6 в деталях
Добро пожаловать в серию «ES6 в деталях»! В этой еженедельной серии статей мы будем изучать ECMAScript 6 — новую готовящуюся к выходу спецификацию языка JavaScript. ES6 имеет множество новых возможностей, которые делают JS мощнее и выразительнее, и каждую неделю мы будем рассматривать эти возможности. Но прежде чем мы приступим, неплохо бы поговорить о том, чем является ES6 и что от него ожидать.

За что отвечает ECMAScript?


Язык JavaScript стандартизирутеся организацией ECMA (наподобие W3C), а сам стандарт носит название ECMAScript. ECMAScript определяет следующее:


Что ECMAScript не определяет, так это всё, что связано с HTML и CSS, а также всевозможные веб-API, например DOM. Всё это определено отдельными стандартами. ECMAScript покрывает те аспекты языка, которые представлены не только в браузерах, но также и в платформах вроде node.js.

Новый стандарт


Пару недель назад итоговый вариант спецификации ECMAScript в шестой редакции был отправлен на утверждение в Ecma General Assembly. Что это означает?

Это значит, что уже этим летом у нас будет новый стандарт для языка JavaScript.

Это большая новость. Новая спецификация JS не падает с небес каждый день. Последняя спецификация, ES5, была принята в 2009 году. Комитет стандарта ES с тех пор работает над ES6.

ES6 является мажорным релизом новой версии языка. В то же время ваш старый код продолжит работать. ES6 обеспечивает максимальную совместимость с уже написанным кодом. Кстати, многие браузеры уже сейчас поддерживают некоторые возможности ES6, и работа над реализацией других фич продолжается. Это значит, что весь ваш код работает в браузерах с реализованными частями ES6! Если вы ещё не наблюдали проблем с совместимостью (а вы их не наблюдали), то и в будущем они не появятся.

Считаем до 6


Предыдущие редакции стандарта ECMAScript имели номера 1, 2, 3 и 5.

Что случилось с четвёртой редакцией? Редакция ECMAScript 4 была запланирована, и над ней было проведено много работы, но в итоге от неё отказались как от слишком амбициозной. (Например, в ней была изощрённая встроенная статическая типизация).

Четвёртая редакция ECMAScript была весьма спорной. Когда комитет по стандартам окончательно прекратил над ней работу, члены комитета решили опубликовать относительно скромную редакцию ES5. После этого они решили продолжить работу над более важными новыми возможностями. Именно поэтому шестая редакция ECMAScript носит название «Harmony» и содержит в спецификации эти два предложения:

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

Это утверждение можно считать чем-то вроде обещания.

Обещания выполнены


В ES5, обновлении 2009 года, были представлены Object.create(), Object.defineProperty(), геттеры и сеттеры, строгий режим (strict mode) и объект JSON. Я использовал все эти возможности, и мне понравилось то, что ES5 сделал для языка. У меня нет слов для описания того, какое влияние эти нововведения оказали на то, как я пишу JS-код. Самым важным нововведением для меня оказались новые методы массивов: .map(), .filter() и тому подобные.

А ECMAScript 6 довольно сильно отличается. Это результат долгих лет слаженной работы. И это клад новых возможностей языка. Наиболее значимое обновление JS, которое было когда-либо. Новые возможности варьируются от простых удобств вроде функций-стрелок и интерполяции строк до мозговзрывающих концепций вроде прокси и генераторов.
Цель этой серии — путём рассмотрения новых возможностей показать вам, как ES6 радикально изменит ваш код.
Мы начнём с фич, которые многие ждали долгое время — ES6-итераторы и новый цикл <nobr>for-of</nobr>. Увидимся на следующей неделе!

Комментарии (28)


  1. E_STRICT
    29.04.2015 19:48

    А сейчас ES6 уже поддерживается где-нибудь?


    1. a553
      29.04.2015 19:53

      Лучше всего в Firefox, не хватает лишь некоторых деталей (Reflect например).


      1. Fesor
        29.04.2015 19:59
        +2

        kangax.github.io/compat-table/es6 — подробнее.


    1. Fesor
      29.04.2015 19:58
      +2

      А зачем ждать пока будут поддерживать?
      babeljs.io


      1. serf
        29.04.2015 21:25

        Насколько удобно использовать babel для node (отладка допустим, как там с сорсмапами)? Для браузера понятно как.


        1. zxcabs
          30.04.2015 01:33
          +1

          1. serf
            30.04.2015 08:57

            Это легко гуглится, меня интересовал личный опыт, удобство, потому что вижу что существуют баги вроде этого github.com/babel/babel/issues/983


            1. cryptograf
              30.04.2015 17:37
              +1

              Из личного опыта проблем с сорсмапами замечено не было


    1. Aingis
      29.04.2015 21:26
      -1

      Частично, да. В том же io.js. iliakan уже сайт на нём сделал: habrahabr.ru/post/255885


  1. 63pHc
    29.04.2015 20:11
    -7

    А можно начать изучать ES6, не изучая JS до этого?


    1. Fesor
      29.04.2015 20:31
      +14

      В смысле можно ли начать изучать JS?


  1. stas404
    29.04.2015 22:02
    +1

    На тему изучения ES6 — есть неплохой интерактивный курс:
    tagtree.io/courses/expert-es6
    12 последовательных уроков с примерами и практическими заданиями в конце каждого урока. На английском.


    1. grossws
      30.04.2015 05:30
      +1

      Какое-то оно тривиальное и скучное.


      1. stas404
        30.04.2015 09:07

        Согласен, что простовато. Скорее, знакомство с синтаксисом, нежели практический экскурс.
        Оставлю еще одну ссылочку на github Addy Osmani:
        github.com/addyosmani/es6-equivalents-in-es5
        Куски кода на es6 и их эквиваленты на es5 — быть может, будет поинтереснее.


    1. SerDIDG
      30.04.2015 07:12

      Чёт как-то они и сами не знают JS. Просто шикарный пример архаизма:

      for(var i = 0; i < owners.length; i++){
          var name = owners[i];
          console.log('Owner ' + name);
      }
      

      И по-этому они предлагают использовать не менее жуткий, забывая всё о чём говорилось в предыдущих уроках:

      for(let i = 0; i < owners.length; i++){
          let name = owners[i];
          console.log('Owner ' + name);
      }
      

      Что нужно было (если я правильно понял суть):

      owners.forEach((name) => {
          console.log(`Owner ${name}`);
      });
      


      1. SerDIDG
        30.04.2015 07:17
        -1

        Или даже так:

        owners.forEach((name) => console.log(`Owner ${name}`));
        


      1. TheShock
        30.04.2015 15:18
        +1

        Чем не нравится вариант с let? Да и с вар. Анонимные функции имеют свои проблемы


        1. SerDIDG
          30.04.2015 16:21

          Использованием цикла for, присвоением двух лишней переменных, лишняя грязь.

          > Анонимные функции имеют свои проблемы
          Да нельзя выйти из цикла, но если нужно выйти можно всегда вместо for / forEach использовать filter / map и тд, что мне кажется более изысканным решением, чем нежели останавливать цикл.


          1. Fesor
            30.04.2015 16:54
            +7

            А еще forEach в разы медленнее старого доброго for, добавляет накладные расходы на обращение к родительскому скоупу и куча разных мелочей. Собственно как и map, reduce и т.д. Так что не всегда они хороши (хотя скоро будут, тикеты соответствующие есть, ими занимаются...). Если вы работаете с большими объемами данных (например canvas) то forEach вам явно не понравится использовать. Даже реализация forEach на for быстрее forEach…


            1. SerDIDG
              01.05.2015 05:34

              Действительно, даже и не знал. На ~86-90% медленнее чем for с callback.


          1. TheShock
            05.05.2015 11:46

            А еще проблемы с отладкой: проблемы с бряками, стеком, скоупом
            Про производительность вам уже сказали и это ПРАВДА серьезная проблема даже без попиксельной работы.
            Тем более в ес5 еще и контекст теряется без дополнительных действий.


            1. SerDIDG
              05.05.2015 16:32

              Ни одной из проблем ещё не испытывал, а вот, как написал выше, провёл тесты и да, производительность процентов на 90 проседает. Если что, я ни в коем случае не перечу вам, и в целом согласен со всеми аргументами.


              1. TheShock
                05.05.2015 17:39
                -3

                Самое простое:



                Где делся из замыканий X?


                1. SerDIDG
                  05.05.2015 17:51

                  Ммм?

                  screencloud.net/v/qtRQ

                  В скопе нет, но надо ли?


                  1. TheShock
                    05.05.2015 17:55
                    -3

                    Да, если использовать, то он появляется. Я говорю именно про дебаг, а не про код. Это на простом примере я показал, что есть свои нюансы


  1. monolithed
    30.04.2015 01:35
    +1

    1. Arilas
      30.04.2015 02:15

      И кроме этого уже есть Final Draft, который уже врятли изменится — ES2015 specifications drafts