JavaScript (часто сокращается как JS) — это один из самых популярных языков программирования, используемый для создания интерактивных веб-страниц. Он постоянно развивается, и за годы своего существования претерпел множество изменений.
Описание: Узнайте, как версии ECMAScript, от ES5 до новейших обновлений, изменили JavaScript. Сравните функционал и улучшения в примерах кода.
JavaScript динамический и многогранный язык программирования, который прошел через несколько значительных изменений с момента своего создания. Различные версии JavaScript (ECMAScript) предоставляют новые возможности и улучшают существующий синтаксис и функциональность языка.
ECMAScript — это стандарт, на котором основан JavaScript. Именно версии ECMAScript определяют, какие возможности и синтаксис доступны в языке.
В этой статье мы подробно рассмотрим ключевые отличия между версиями ECMAScript, с акцентом на примерах кода.
Введение в историю
Названия версий JavaScript, такие как ECMAScript 2020 (ES11), ECMAScript 2021 (ES12), и так далее, происходят от стандарта ECMAScript, который формирует основу языка JavaScript. Чтобы понять, откуда это название взялось и почему оно так важно, давайте рассмотрим историю и контекст.
Вот как это происходило и почему:
- Создание ECMAScript:
- ECMAScript был разработан в 1997 году организацией Ecma International (ранее ECMA). Это стандарт, который задает общие правила и спецификации для реализации языка сценариев, таких как JavaScript, JScript и ActionScript.
- Название “ECMAScript” произошло от аббревиатуры ECMA (European Computer Manufacturers Association) и Script, что обозначает стандарт для скриптовых языков.
- JavaScript и ECMAScript:
- JavaScript был первоначально создан Netscape и выпущен в 1995 году. Это один из самых популярных языков программирования в веб-разработке.
- Когда JavaScript был создан, его спецификация не была стандартом, и разные браузеры начали реализовывать свой собственный набор функций и синтаксиса. Это создавало проблемы совместимости.
- Для унификации и стандартизации синтаксиса и функциональности был создан стандарт ECMAScript.
- Влияние ECMAScript на JavaScript:
- ECMAScript задает основные синтаксические правила и функциональные возможности, которые должны быть реализованы в различных версиях JavaScript.
- Когда обновляется стандарт ECMAScript, это влияет на новые возможности и синтаксические конструкции, которые становятся доступны в языке JavaScript. В каждой новой версии ECMAScript добавляются улучшения и новые функции, что отражается в языках программирования, таких как JavaScript, которые реализуют этот стандарт.
ECMAScript обеспечивает стандартизацию, что позволяет разработчикам писать код, который будет работать во всех современных браузерах и средах выполнения JavaScript. Каждая новая версия ECMAScript вносит новые возможности, которые облегчают разработку и расширяют функциональность языка, что делает код более эффективным и современным.
Ранние версии и их особенности
Сначала погрузимся в историю, а потом рассмотрим современные версии JS и их особенности.
- JavaScript 1.0: Первая версия, заложившая основы языка.
- JavaScript 1.1: Внес небольшие улучшения в синтаксис и функциональность.
- JavaScript 1.2: Добавил новые объекты и методы для работы с DOM (Document Object Model).
JavaScript 1.0: Первая версия, заложившая основы языка
JavaScript 1.0, представленная в 1996 году, стала первой версией языка, который изначально назывался “LiveScript”. Эта версия обеспечила базовые функции, такие как поддержка переменных, операторов, функций и простых операций с документами. JavaScript 1.0 был разработан для работы с HTML-страницами и предназначался для добавления интерактивности и динамических элементов на веб-страницы. В этой версии были введены концепции, такие как объекты и массивы, хотя их возможности были весьма ограниченными по сравнению с современными стандартами.
Пример JS 1.0: Простая функция и обработка событий:
<button onclick="showMessage()">Нажми меня</button>
<script>
function showMessage() {
alert('Привет, JavaScript 1.0!');
}
</script>
В этом примере мы видим использование базовых функций JavaScript 1.0: определение функции showMessage() и привязка её к событию onclick кнопки. Это демонстрирует основное использование функций и событий, доступное в первой версии JavaScript.
JavaScript 1.1: Внес небольшие улучшения в синтаксис и функциональность
В 1996 году также была выпущена версия JavaScript 1.1. Эта версия улучшила некоторые аспекты синтаксиса и добавила новые возможности, такие как улучшенная работа с массивами и строками. Основное внимание было уделено повышению функциональности языка, упрощению работы с объектами и улучшению поддержки событий. Введение новых методов и свойств позволило разработчикам создавать более сложные и интерактивные веб-приложения. Хотя изменения были относительно незначительными, они заложили основы для последующих обновлений.
Пример JS 1.1: Работа с массивами и строками:
<button onclick="processArray()">Обработка массивов</button>
<script>
function processArray() {
var names = ['Алиса', 'Иван', 'Владимир'];
var result = '';
for (var i = 0; i < names.length; i++) {
result += names[i] + ' ';
}
alert('Имена: ' + result);
}
</script>
Этот пример показывает улучшения в работе с массивами, которые были добавлены в JavaScript 1.1. Мы создаем массив, проходимся по нему с помощью цикла for и объединяем элементы массива в строку, которую затем отображаем.
JavaScript 1.2: Добавил новые объекты и методы для работы с DOM (Document Object Model)
JavaScript 1.2, выпущенная в 1997 году, принесла значительные улучшения в язык. Одним из главных нововведений было расширение возможностей для работы с DOM (Document Object Model). В этой версии были добавлены новые объекты и методы, что позволило разработчикам более эффективно манипулировать элементами веб-страниц. Включение новых функций упростило доступ к элементам документа, их изменение и управление событиями. Это обновление сыграло ключевую роль в развитии динамических веб-приложений и обеспечило большую гибкость и функциональность для разработчиков.
Пример JS 1.2: Работа с DOM:
<div id="message">Изначальный текст</div>
<button onclick="changeText()">Измененный текст</button>
<script>
function changeText() {
var element = document.getElementById('message');
element.innerHTML = 'Текст обновлен с помощью JavaScript 1.2!';
}
</script>
Этот пример демонстрирует использование возможностей JavaScript 1.2 для работы с DOM. Мы используем метод getElementById для получения элемента по его ID и изменяем его содержимое с помощью свойства innerHTML. Это демонстрирует улучшения в работе с DOM, добавленные в этой версии JavaScript.
ECMAScript и его версии
С момента стандартизации JavaScript под названием ECMAScript, версии стали нумероваться по годам выпуска:
- ECMAScript 3 (ES3): Стала де-факто стандартом для браузеров на долгие годы.
- ECMAScript 5 (ES5): Значительно расширила возможности языка, добавив такие функции, как
strict mode, методы массивов,Object.create, и другие. - ECMAScript 6 (ES6) или ECMAScript 2015: Революционная версия, представившая множество новых возможностей, включая классы, модули, стрелочные функции, let и const, и многое другое.
- ECMAScript 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024: Каждая последующая версия привносила новые функции и улучшения, такие как асинхронное программирование с async/await, деструктуризация объектов, шаблоны литералов и другие.
Почему так много версий ? Этому есть причины. Постоянное развитие веб-технологий и растущие требования разработчиков подталкивают комитет по стандартизации ECMAScript к регулярному обновлению языка. Новые версии появляются каждый год, что позволяет JavaScript оставаться актуальным и конкурентоспособным.
Разберем подробнее версии ECMAScript с примерами.
ECMAScript 5 (ES5): Основы и Новшества
ECMAScript 5 (ES5), выпущенный в 2009 году, стал значительным шагом вперед в развитии JavaScript. Эта версия внедрила множество новых функций и улучшений, которые значительно повысили производительность и удобство работы с языком.
ECMAScript 5 (ES5) добавил методы для работы с массивами, улучшения для работы с объектами и строгий режим, который помогает избежать распространенных ошибок.
Во-первых, ES5 внедрил методы для работы с массивами, такие как forEach, map, filter, и reduce. Эти методы упрощают обработку массивов, позволяя выполнять итерации и преобразования данных без необходимости использования циклов for. Например:
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
Во-вторых, ES5 добавил поддержку strict mode, который помогает находить ошибки и улучшать безопасность кода. В строгом режиме JavaScript требует, чтобы код следовал более строгим правилам:
'use strict';
x = 3.14; // Ошибка: x не объявлена
Также в ES5 были введены getter и setter методы, которые позволяют управлять доступом к свойствам объектов и выполнять дополнительную логику при их изменении.
ECMAScript 6 (ES6): Революция в JavaScript
ECMAScript 6 (ES6), официально известный как ECMAScript 2015, стал важным этапом в эволюции JavaScript, предоставив множество новых возможностей и улучшений.
Первое значительное изменение в ES6 — это добавление let и const для объявления переменных. В отличие от var, который имеет функциональную область видимости, let и const имеют блочную область видимости, что позволяет избежать многих проблем, связанных с замыканиями:
if (true) {
let a = 10;
const b = 20;
}
console.log(a); // Ошибка: a не определена
console.log(b); // Ошибка: b не определена
Кроме того, ES6 ввел стрелочные функции, которые имеют более короткий синтаксис и не изменяют контекст this:
const add = (a, b) => a + b;
console.log(add(5, 3)); // 8
ES6 также добавил class для определения классов, что делает объектно-ориентированное программирование в JavaScript более интуитивно понятным:
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Привет, мое имя ${this.name}`);
}
}
const john = new Person('Иван');
john.greet(); // Привет, мое имя Иван
Другим важным нововведением стали шаблонные строки, которые позволяют включать выражения в строки и выполнять многострочные строки без специальных символов:
const name = 'Алиса';
const greeting = `Привет, ${name}!`;
console.log(greeting); // Привет, Алиса!
ECMAScript 2016 – 2019: Постепенные Улучшения
После ES6, стандарт JavaScript продолжил развиваться, внедряя новые функции с каждым обновлением. Например:
ECMAScript 2016 добавил метод Array.prototype.includes, который упрощает проверку наличия элемента в массиве:
const fruits = ['яблоко', 'банан', 'манго'];
console.log(fruits.includes('банан')); // true
ECMAScript 2017 представил async и await, которые значительно упростили работу с асинхронным кодом, позволяя писать асинхронные функции в синхронном стиле:
async function fetchData() {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
console.log(data);
}
fetchData();
ECMAScript 2018 добавил Object.prototype.finally и RegExp улучшения, а ECMAScript 2019 внедрил Array.prototype.flat и flatMap методы для работы с многомерными массивами:
const arr = [1, 2, [3, 4, [5, 6]]];
console.log(arr.flat(2)); // [1, 2, 3, 4, 5, 6]
ECMAScript 2020 (ES11)
Основные изменения:
- Оператор нулевого слияния (Nullish Coalescing Operator)
??: Позволяет обрабатывать значенияnullиundefined, избегая конфликтов с другими ложными значениями, такими как0или''. - Цепочка вызовов опциональных методов (Optional Chaining)
?.: Позволяет безопасно обращаться к вложенным свойствам объектов, даже если промежуточные свойства могут бытьnullилиundefined. - Методы
String.prototype.matchAll: Позволяет выполнять регулярные выражения с глобальными флагами и возвращать все совпадения.
Примеры:
1. Оператор нулевого слияния (Nullish Coalescing Operator) ??:
const user = {
name: null,
age: 0
};
const name = user.name ?? 'Default Name'; // 'Default Name'
const age = user.age ?? 18; // 0
console.log(name, age);
2. Цепочка вызовов опциональных методов (Optional Chaining) ?.:
const user = {
profile: {
email: 'user@example.com'
}
};
const email = user.profile?.email; // 'user@example.com'
const address = user.profile?.address?.street; // undefined
console.log(email, address);
3. Методы String.prototype.matchAll:
const text = 'abc123def456';const regex = /\d+/g; const matches = text.matchAll(regex); for (const match of matches) { console.log(match[0]); }
ECMAScript 2021 (ES12)
Основные изменения:
- Логические операторы
&&=и||=(Logical Assignment Operators): Позволяют объединять операции присвоения с логическими операциями. - Метод
String.prototype.replaceAll: Позволяет заменить все вхождения подстроки в строке. - Классы полей (Class Fields): Позволяют объявлять свойства класса прямо внутри класса.
Примеры:
1. Логические операторы &&= и ||=:
let value = 5;
value ||= 10; // value = 5 (значение уже истинное, не изменяется)
value &&= 2; // value = 2 (значение изменяется, так как оно истинное)
console.log(value);
2. Метод String.prototype.replaceAll:
const text = 'hello world world';
const newText = text.replaceAll('world', 'universe'); // 'hello universe universe'
console.log(newText);
3. Классы полей (Class Fields):
class Person {
name = 'Anonymous';
age = 30;
}
const person = new Person();
console.log(person.name, person.age);
ECMAScript 2022 (ES13)
Основные изменения:
- Методы
Array.prototype.at: Позволяет получать элемент массива по индексу, включая отрицательные индексы. - Методы
Object.hasOwn: Упрощает проверку наличия свойства в объекте. - Private Methods и Accessors в классах: Позволяют объявлять приватные методы и свойства в классах.
Примеры:
1. Методы Array.prototype.at:
const array = [1, 2, 3, 4];
console.log(array.at(-1)); // 4 (последний элемент)
console.log(array.at(-2)); // 3 (предпоследний элемент)
2. Методы Object.hasOwn:
const obj = { a: 1 };
console.log(Object.hasOwn(obj, 'a')); // true
console.log(Object.hasOwn(obj, 'b')); // false
3. Private Methods и Accessors в классах:
class Example {
#privateField = 42;
#privateMethod() {
return 'This is private';
}
getPrivateInfo() {
return this.#privateMethod();
}
}
const example = new Example();
console.log(example.getPrivateInfo()); // 'This is private'
ECMAScript 2023 (ES14)
Основные изменения:
- Методы
Array.prototype.findLastиArray.prototype.findLastIndex: Позволяют находить последний элемент в массиве, который соответствует условию. - Оператор
awaitв функциях верхнего уровня (Top-Level Await): Позволяет использоватьawaitв верхнем уровне модулей. - Методы
WeakRefиFinalizationRegistry: Позволяют управлять памятью более гибко.
Примеры:
1. Методы Array.prototype.findLast и Array.prototype.findLastIndex:
const numbers = [1, 2, 3, 4, 5];
const lastEven = numbers.findLast(num => num % 2 === 0); // 4
const lastEvenIndex = numbers.findLastIndex(num => num % 2 === 0); // 3
console.log(lastEven, lastEvenIndex);
2. Оператор await в функциях верхнего уровня (Top-Level Await):
// Пример работы в модуле
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
};
fetchData();
3. Методы WeakRef и FinalizationRegistry:
class Example {
constructor(name) {
this.name = name;
}
}
const registry = new FinalizationRegistry((heldValue) => {
console.log(`${heldValue} has been garbage collected`);
});
let example = new Example('MyObject');
registry.register(example, 'MyObject');
example = null; // Триггерит сборку мусора, сообщение будет выведено
ECMAScript 2024 (ES15)
Основные изменения:
- Методы
Array.prototype.toSorted,Array.prototype.toReversedиArray.prototype.toSpliced: Позволяют создавать новые массивы с сортировкой, переворотом и изменениями, не изменяя оригинальные массивы. - Оператор
#в строках (Private Fields): Разрешает использование приватных полей внутри строк. - Улучшенная поддержка регулярок: Новые возможности работы с регулярными выражениями.
Примеры:
1. Методы Array.prototype.toSorted, Array.prototype.toReversed и Array.prototype.toSpliced:
const numbers = [3, 1, 4, 1, 5, 9];
// Пример toSorted
const sortedNumbers = numbers.toSorted(); // [1, 1, 3, 4, 5, 9]
console.log(sortedNumbers);
// Пример toReversed
const reversedNumbers = numbers.toReversed(); // [9, 5, 4, 1, 1, 3]
console.log(reversedNumbers);
// Пример toSpliced
const splicedNumbers = numbers.toSpliced(2, 1, 8); // [3, 1, 8, 5, 9]
console.log(splicedNumbers);
2. Оператор # в строках (Private Fields):
class MyClass {
#privateField = 'hidden';
getPrivateField() {
return this.#privateField;
}
}
const instance = new MyClass();
console.log(instance.getPrivateField()); // 'hidden'
3. Улучшенная поддержка регулярок:
const regex = /(?<name>\w+): (?<value>\d+)/;
const match = regex.exec('age: 30');
console.log(match.groups.name); // 'age'
console.log(match.groups.value); // '30'
Эти примеры демонстрируют, как каждое обновление ECMAScript привносит новые возможности и улучшения в язык JavaScript.
Заключение
Каждая новая версия ECMAScript приносит улучшения и новые возможности, которые облегчают разработку и расширяют функциональность JavaScript.
Понимание этих изменений помогает программистам адаптироваться к новому синтаксису и инструментам, делая код более современным и эффективным. Независимо от версии, знание возможностей и особенностей каждой версии позволяет оптимизировать процесс разработки и создавать качественное программное обеспечение.

Я, Итан Картер – американский разработчик и технический автор с более чем 20-летним опытом в системном и прикладном программировании. Мой основной профиль — низкоуровневая разработка на Assembler: 22 года практики, включая глубокую работу с оптимизацией кода, архитектурой процессоров и производительностью критичных по скорости решений. Я защитил PhD dissertation по Assembler, а также более 18 лет работаю с ASP.NET, создавая корпоративные веб-системы, API и масштабируемые backend-решения.
Дополнительно я имею 9 лет опыта в C++ и C#, а также 7 лет практики программирования микроконтроллеров на Assembler. Благодаря моему сочетанию академической подготовки и прикладного инженерного опыта я могу писать статьи на стыке архитектуры ПО, низкоуровневой оптимизации и современной разработки, делая сложные технические темы понятными для профессиональной аудитории.






