Добро пожаловать обратно в наше увлекательное путешествие по постоянно развивающемуся миру JavaScript, где инновации не знают границ. Если вы следили за моими предыдущими главами, вы уже хорошо знакомы с блестящей историей JavaScript, от его первых дней до преобразующего скачка ECMAScript 2016 в 2018. Теперь пришло время приступить к следующему этапу нашего приключение, еще глубже погружаясь в захватывающее царство ECMAScript, изучая годы с 2019 по 2023 год.
🔍Двигаясь вперед, мы не просто наблюдаем за развитием JavaScript; мы являемся активными участниками динамичного повествования, которое продолжает менять ландшафт веб-разработки. От перекрестка ES5 до революционного ES6 и далее, JavaScript находился на неустанном пути самосовершенствования, предоставляя разработчикам возможность создавать более захватывающий пользовательский опыт и динамичные цифровые среды.
🎮 Итак, приготовьтесь к очередному захватывающему путешествию в очаровательный мир JavaScript, где код выходит за рамки простого синтаксиса, а воображение находит свое полотно на цифровом фронте. Каждое нажатие клавиши, каждая итерация приближает нас к раскрытию всей магии JavaScript — симфонии логики и творчества, которая изменила то, как мы подключаемся и общаемся в сети.
🔮 Присоединяйтесь к нам, и мы отправимся в следующую главу нашей одиссеи, где взаимодействие прошлого и настоящего продолжает формировать будущее цифровых инноваций. Наше путешествие выводит нас за пределы основ, заложенных ES6, и горизонт пылает обещаниями постоянно развивающегося великолепия JavaScript! 🚀✨
Пройдя период с 2019 по 2023 год, мы воочию станем свидетелями того, как этот эволюционный подход продолжает формировать ландшафт JavaScript.
ECMAScript 2019
Основные особенности:
- Необязательная привязка Catch: эта функция позволяет опустить привязку параметра предложения catch. Это повышает читаемость кода и снижает вероятность непреднамеренного затенения переменных.
- Object.fromEntries(): введен метод
Object.fromEntries()
, который позволяет преобразовывать пары ключ-значение в объект. Это особенно полезно при работе с данными в виде массивов или других итерируемых структур. - Array.prototype.{ Flat, FlatMap}(): эти методы упрощают манипулирование вложенными массивами.
flat()
выравнивает вложенные массивы до заданной глубины, аflatMap()
сначала отображает, а затем создает новый массив, выравнивая массив.
Преимущества:
- Дополнительная привязка Catch повышает ясность кода, давая понять, что ожидается ошибка, но объект ошибки не требуется для дальнейшей обработки.
Object.fromEntries()
упрощает преобразование данных между форматами, уменьшая необходимость в подробном коде.Array.prototype.{flat, flatMap}()
оптимизируйте обработку сложных массивов, упрощая работу с глубоко вложенными структурами данных.
// Optional Catch Binding try { // Some code that may throw an error } catch { // Handle the error without specifying a parameter } // Object.fromEntries() const keyValuePairs = [['key1', 'value1'], ['key2', 'value2']]; const obj = Object.fromEntries(keyValuePairs); // Output: { key1: 'value1', key2: 'value2' } // Array flat() method let array = [1, 2, [3, 4]]; console.log(array.flat()); // Output: [1, 2, 3, 4] // Array flatMap() method let numbers = [1, 2, 3, 4]; console.log(numbers.flatMap(x => [x, x*2])); // Output: [1, 2, 2, 4, 3, 6, 4, 8]
Сравнение:
ECMAScript 2019 (ES10) опирается на основу, заложенную его предшественниками, включая ECMAScript 2015 (ES6). В нем представлены такие функции, как необязательная привязка Catch, Object.fromEntries() и улучшенные методы массива, которые делают код более читабельным и эффективным. Эти дополнения позволяют разработчикам писать более лаконичный и выразительный код JavaScript, сохраняя при этом обратную совместимость.
ECMAScript 2020
Основные особенности:
- Нулевой оператор объединения (
??
): Нулевой оператор объединения улучшает назначение переменных, предоставляя значение по умолчанию только в том случае, если переменная имеет значение NULL или неопределена, что повышает ясность и безопасность кода. - Необязательное связывание (
?.
): Оператор необязательного связывания упрощает работу со свойствами вложенных объектов, позволяя разработчикам безопасно получать доступ к свойствам или методам, которые могут не существовать, не вызывая ошибок. - Динамический импорт. Динамический импорт позволяет загружать модули во время выполнения, улучшая разделение кода и уменьшая первоначальный размер пакета в веб-приложениях.
Promise.allSettled()
собирает результаты нескольких обещаний, включая как выполненные, так и отклоненные, предоставляя комплексное представление об их выполнении.
Преимущества:
- Нулевой оператор объединения (
??
): он упрощает присвоение значений по умолчанию и помогает избежать неожиданного поведения с ложными значениями. - Необязательное связывание (
?.
): оно делает код более кратким и уменьшает необходимость в подробных проверках на значение null/undef. - Динамический импорт: повышает производительность и эффективность загрузки веб-приложений.
Promise.allSettled()
: Обеспечивает комплексное представление результатов выполнения нескольких обещаний, позволяя обрабатывать как выполненные, так и отклоненные обещания без досрочного отклонения, что делает его подходящим для сценариев, в которых вам необходимо обработать все обещания и собрать информацию об их успехе или неудаче.
// Nullish Coalescing Operator let someValue = null; const defaultValue = someValue ?? 'Default'; // Optional Chaining const nestedObject = { data: { value: 42 } }; const result = nestedObject.data?.value; // Output: 42 // Dynamic Import const module = await import('./module.js'); // Promise.allSettled() const prom1 = new Promise((resolve, reject) => { setTimeout(() => resolve('Promise 1 resolved'), 1000); }); const prom2 = new Promise((resolve, reject) => { setTimeout(() => reject('Promise 2 rejected'), 500); }); const prom3 = new Promise((resolve, reject) => { setTimeout(() => resolve('Promise 3 resolved'), 1500); }); Promise.allSettled([prom1, prom2, prom3]) .then((results) => { results.forEach((result, index) => { if (result.status === 'fulfilled') { console.log(`Promise ${index + 1}: ${result.value}`); } else { console.error(`Promise ${index + 1} failed with reason: ${result.reason}`); } }); }) .catch((error) => { console.error('An error occurred while handling settled promises:', error); }); // Output Promise 1: Promise 1 resolved Promise 2 failed with reason: Promise 2 rejected Promise 3: Promise 3 resolved
Сравнение:
В ECMAScript 2020 (ES11) представлены такие важные функции, как нулевой оператор объединения, необязательная цепочка, динамический импорт и многие другие. Эти дополнения направлены на улучшение читаемости кода, безопасности и производительности.
ECMAScript 2021
Основные особенности:
- Promise.any(): метод
Promise.any()
используется для ожидания выполнения первого решенного обещания из итерации обещаний. Он возвращает обещание, которое разрешается со значением первого выполненного обещания. - String replaceAll(): метод
replaceAll()
— это строковый метод, который заменяет все вхождения указанной подстроки или шаблона регулярного выражения другой подстрокой. - Числовые разделители (_). Числовые разделители позволяют использовать символы подчеркивания (_) внутри числовых литералов, что делает большие числа более читабельными за счет разделения их на группы.
Преимущества:
- Promise.any(): упрощает обработку нескольких обещаний и позволяет реагировать на первое выполненное обещание, улучшая организацию асинхронного кода.
- String replaceAll(): обеспечивает удобный способ замены всех вхождений подстроки или шаблона в строке, улучшая манипуляции со строками.
- Числовые разделители (_). Числовые разделители улучшают читаемость кода при работе с большими числами, разбивая их на управляемые группы.
// Promise Any const first = await Promise.any([prom1, prom2, prom3]); // String replaceAll() const originalString = 'Hello, world! Hello, universe!'; const newString = originalString.replaceAll('Hello', 'Hi'); // Numeric Separators (_) const billion = 1_000_000_000; const largeNumber = 123_456_789;
Сравнение:
В ECMAScript 2021 (ES12) представлены такие ценные функции, как Promise.any()
, String replaceAll()
и числовые разделители. Эти дополнения направлены на упрощение асинхронной обработки кода, улучшение манипуляций со строками и улучшение читаемости кода при работе с большими числовыми значениями.
ECMAScript 2022
Основные особенности:
- Array at(): метод
Array.prototype.at()
позволяет получить доступ к элементу по определенному индексу в массиве. Он упрощает поиск элементов и корректно обрабатывает отрицательные индексы. - String at(): метод
String.prototype.at()
обеспечивает доступ к символам строки по определенному индексу. Это похоже на индексацию массива для строк. - Флаг RegExp /d. Флаг
/d
для регулярных выражений вводит новое поведение, при котором он соответствует только именованным группам захвата. Это улучшает обработку регулярных выражений и упрощает извлечение определенных данных из строк. - Object.hasOwn(): метод
Object.hasOwn()
предоставляет простой способ проверить, имеет ли объект определенное свойство, которым он непосредственно владеет (а не унаследовано от его прототипа). - error.cause: Свойство
error.cause
используется для доступа к причине ошибки, что может быть полезно для более информативной диагностики и обработки ошибок. - await import: оператор
await import
позволяет асинхронно импортировать модули, улучшая разделение кода и уменьшая начальные размеры пакетов в веб-приложениях. - Частные методы и поля. Частные методы и поля обеспечивают инкапсуляцию и конфиденциальность членов класса, помечая их как частные, доступные только внутри класса.
- Объявления полей класса. Объявления полей класса позволяют объявлять свойства класса непосредственно внутри класса без использования конструкторов, что упрощает определения классов.
Преимущества:
- Array at(): обеспечивает простой и безопасный способ доступа к элементам массива по индексу, включая обработку отрицательных индексов и проверки выхода за пределы.
- String at(): упрощает доступ к символам внутри строк, делая манипуляции со строками более простыми.
- Флаг RegExp /d: расширяет функциональность регулярных выражений, упрощая извлечение определенных данных из строк.
- Object.hasOwn(): предлагает удобный метод проверки владения свойством объекта, улучшая проверку свойств.
- error.cause: улучшает обработку ошибок, предоставляя доступ к основной причине ошибки.
- await import: повышает производительность и эффективность загрузки веб-приложений, позволяя асинхронную загрузку модулей.
- Частные методы и поля: они улучшают инкапсуляцию классов и конфиденциальность, снижая риск непреднамеренного внешнего доступа.
- Объявления полей классов. Они упрощают объявления свойств классов, что приводит к более чистым и кратким определениям классов.
// Array at() const arr = [10, 20, 30]; const value = arr.at(1); // Output: 20 // String at() const str = 'Hello, world!'; const char = str.at(7); // Output: 'w' // RegExp /d Flag const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/d; const result = regex.exec('2022-09-15'); // Captures named groups only // Object.hasOwn() const obj = { prop: 'value' }; const hasProp = Object.hasOwn(obj, 'prop'); // true // error.cause try { // Some code that may throw an error } catch (error) { const rootCause = error.cause; } // await import const module = await import('./module.js'); // Private methods and fields class MyClass { #privateField = 42; #privateMethod() { return 'This is a private method'; } } // Class field declarations class MyClass { field = 'Value'; }
Сравнение:
ECMAScript 2022 (ES13) представил множество функций, включая улучшенные методы массивов и строк, улучшения регулярных выражений, новые методы объектов, улучшения обработки ошибок, асинхронную загрузку модулей, частные методы и поля, а также объявления полей классов.
Ссылка на предыдущие статьи: