[Перевод] ECMAScript 4: версия, которой не было

Будущих студентов курса «Javascript Developer. Basic» приглашаем посетить demo day, в рамках которого вы сможете подробно узнать о процессе обучения и программе курса, а также задать вопросы нашим экспертам.

А пока подготовили традиционный перевод интересной статьи.

fd8d8726ff2e8c5e806b3f4ea43c648d

Вы наверняка заметили, что в системах сборки кода используются спецификации ECMAScript 3, затем ECMAScript 5 и так далее. ECMAScript 4 не используется никогда. Почему?

Я подумал, что было бы интересно изучить историю ECMAScript 4 и выяснить, чего мы лишились.

Краткая история

Согласно Википедии, первая версия ECMAScript 4 появилась в феврале 1999 года. Работу над спецификацией планировалось завершить к августу 2008 года.

Язык ECMAScript 4 был перспективной разработкой, в нем появилось множество новых возможностей, которых очень не хватало в ECMAScript 3. В четвертой редакции были исправлены некоторые недочеты ECMAScript 3, в связи с чем ES4 стал несовместим предыдущими версиями.

С самого начала вокруг ES4 разгорелось много споров, большинство разработчиков браузеров новинку не поддержали, и работу над ES4 пришлось прекратить.

В 2008 году от ES4 официально отказались, а стандарт ES3.1 переименовали в ES5. Это было более скромное, корректировочное обновление ECMAScript.

Пожалуй, в то время больше всего на ES4 был похож ActionScript 3 для Flash-приложений. После выпуска AS3 некоторые из нас даже думали, что Flash и веб в конце концов станут единым целым.

В блоге auth0 опубликована шикарная статья о борьбе за ES4 и об истории его разработки. Рекомендую ознакомиться.

А что могло бы быть?

Классы

Классы все-таки появились в ES6, но вот как мог бы выглядеть код, если бы это произошло раньше.

class C {

 var val
 var number = 500;

 const pi = 3.14

 // A function
 function f(n) { return n+val*2 }

 // Getters and setters
 function set foo(n) {
   val = n;
 }

 function get foo() {
   return val;
 }
}

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

Обратите внимание, что здесь нет ключевого слова this. Вместо того чтобы по умолчанию считать переменные глобальными, в ES4 сначала проверяются переменные класса, а затем проверяются верхние области видимости.

Также в ES4 были следующие ключевые слова для определения элементов классов:

  1. static

  2. final

  3. private, protected, public.

  4. prototype — для определения элемента класса по прототипу. Не знаю, где это можно использовать, но, видимо, где-то можно.

Интерфейсы

В ES4 появились интерфейсы. К сожалению, на современном этапе эта возможность реализована только в Typescript.

interface MyInterface {
  function foo();
}

Строгая типизация

В ES4 появилась строгая типизация.

function add(a: int, b:int): int {
  return a + b;
}

Также в нем было ключевое слово type, работающее аналогично объединению типов в Typescript. В Typescript объединение типов записывается так:

let a : number | string;

А в ES4 так:

var a: (number, string)

В ES4 также были дженерики:

class Wrapper {
  inner: T
}

Like 

По умолчанию типы в ES4 являются точными типами, а не надмножествами. Ключевое слово like позволяет снять это ограничение.

function getCell(coords: like { x: int, y: int }) {

}

Скорее всего, такая возможность была предусмотрена в ES4 потому, что в нем использовалась номинативная типизация, а не структурная, как в Typescript.

Новые типы данных

Сейчас в ES есть boolean, object, array, number, BigInt. В ES4 планировали добавить еще несколько типов данных:

  1. byte

  2. int

  3. unit

  4. double

  5. decimal

Сейчас из этого списка в ES планируется добавить только decimal, и, вероятно, при использовании этого типа код будет выглядеть так:

const allowance = 1.50m

В ES4 также был суффикс m, который означал деньги (money).

Строки в тройных кавычках

Для записи строки Hello my name is "Evert" в ES4 можно использовать тройные кавычки:

const hi = """Hello my name is "Evert"""";

Пакеты

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

Если класс определяется так:

package com.evertpot {

  // Private
  internal const foo = 5;

  class MyClass {

  }

}

то его можно использовать таким образом:

const myObj = com.evertpot.MyClass;

или:

import * from com.evertpot;
const myObj = MyClass;

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

Универсальные (generic) функции

Универсальные функции не следует путать с параметризованными функциями. Функции этого вида немного напоминают «перегруженные функции» в Typescript, но они гораздо мощнее.

Пример

class Foo {


  generic function addItem(x);

  function addItem(x: int) {
  }

  function addItem(x: number) {
  }

}

В этом примере я вызываю функцию addItem двумя способами — с использованием типов int и number. Необходимый способ будет выбран при исполнении кода.

E4X

С технической точки зрения E4X — это расширение ES4, но оно заслуживает внимания.

E4X означает ECMAScript для XML. Может быть, звучит не очень интересно, но взгляните на код:

const myClass = 'welcome';
const name = 'Evert';
const foo = 
{"Hello " + name }
;

Знакомо?

Это, конечно, не JSX, но вполне вероятно, что это расширение могло лежать в основе JSX.

И хотя спецификация ES4 так и не вышла, расширение E4X на самом деле работало в Firefox вплоть до десятой версии.

Дополнительные возможности

  • Синтаксис let const для задания констант на уровне блока. В ES5 и последующих версиях областью видимости констант (const) уже является блок.

  • Генераторы (yield).

  • Хвостовая рекурсия.

  • Пространства имен для свойств, классов и других элементов (во многом похожие на пространства имен XML), которые позволяют избежать конфликтов.

Как бы загружались скрипты?

Поскольку ECMAScript 4 несовместим с предыдущими версиями, важно было бы сообщить браузеру, что скрипт нужно интерпретировать как ES4:

Примерно так же мы поступаем с модулями:

Заключение

Надеюсь, вам было интересно почитать о том, каким мог бы быть JavaScript. Мы потихоньку приближаемся к этому стандарту в новых редакциях ECMAScript: появились такие инструменты, как Typescript и препроцессоры JSX,  —, но нам еще далеко до того уровня ECMAScript, который существовал в 2007 году.

Вероятно, если бы ES4 увидел свет, то многим из нас не приходилось бы использовать для сборки такие сложные инструменты как Babel, Webpack и Typescript.

Узнать подробнее о курсе «Javascript Developer. Basic».

Записаться на открытый урок можно здесь.

Читать ещё:

© Habrahabr.ru