Будущих студентов курса "Javascript Developer. Basic" приглашаем посетить demo day, в рамках которого вы сможете подробно узнать о процессе обучения и программе курса, а также задать вопросы нашим экспертам.
А пока подготовили традиционный перевод интересной статьи.
Вы наверняка заметили, что в системах сборки кода используются спецификации 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 были следующие ключевые слова для определения элементов классов:
static
final
private,
protected
,public
.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<T> {
inner: T
}
Like
По умолчанию типы в ES4 являются точными типами, а не надмножествами. Ключевое слово like
позволяет снять это ограничение.
function getCell(coords: like { x: int, y: int }) {
}
Скорее всего, такая возможность была предусмотрена в ES4 потому, что в нем использовалась номинативная типизация, а не структурная, как в Typescript.
Новые типы данных
Сейчас в ES есть boolean
, object
, array
, number
, BigInt
. В ES4 планировали добавить еще несколько типов данных:
byte
int
unit
double
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 = <div class={myClass}>{"Hello " + name }</div>;
Знакомо?
Это, конечно, не JSX, но вполне вероятно, что это расширение могло лежать в основе JSX.
И хотя спецификация ES4 так и не вышла, расширение E4X на самом деле работало в Firefox вплоть до десятой версии.
Дополнительные возможности
Синтаксис
let const
для задания констант на уровне блока. В ES5 и последующих версиях областью видимости констант (const
) уже является блок.Генераторы (
yield
).Хвостовая рекурсия.
Пространства имен для свойств, классов и других элементов (во многом похожие на пространства имен XML), которые позволяют избежать конфликтов.
Как бы загружались скрипты?
Поскольку ECMAScript 4 несовместим с предыдущими версиями, важно было бы сообщить браузеру, что скрипт нужно интерпретировать как ES4:
<script type="text/javascript;version=4" src="..."></script>
Примерно так же мы поступаем с модулями:
<script type="module" src="..."></script>
Заключение
Надеюсь, вам было интересно почитать о том, каким мог бы быть JavaScript. Мы потихоньку приближаемся к этому стандарту в новых редакциях ECMAScript: появились такие инструменты, как Typescript и препроцессоры JSX, — но нам еще далеко до того уровня ECMAScript, который существовал в 2007 году.
Вероятно, если бы ES4 увидел свет, то многим из нас не приходилось бы использовать для сборки такие сложные инструменты как Babel, Webpack и Typescript.
Узнать подробнее о курсе "Javascript Developer. Basic".
Записаться на открытый урок можно здесь.
Читать ещё:
Компоновщик в JavaScript
Почему это антипаттерн?
Compose повсюду: композиция функций в JavaScript