{"componentChunkName":"component---src-templates-post-js","path":"/javascript/interesnie-novovvedeniya-v-javascript-es2021/","result":{"pageContext":{"slug":"interesnie-novovvedeniya-v-javascript-es2021","content":"\n<p>В этой статье вы узнаете про интересные нововведения в JavaScript, которые ожидают нас в 2021 году. Не все конечно, но тут собраны и описаны самые интересные из них.</p>\n\n\n\n<p class=\"author\"><em><a href=\"https://codeburst.io/exciting-features-of-javascript-es2021-es12-1de8adf6550b\" data-type=\"URL\" data-id=\"https://codeburst.io/exciting-features-of-javascript-es2021-es12-1de8adf6550b\">Перевод JavaScript ES2021 Exciting Features</a></em></p>\n\n\n\n<p>Каждый год в JavaScript добавляется новый функционал. В этом году был зарелизен ES2020 или ES11, теперь мы ожидаем релиза ES2021(ES12), который намечается на середину 2021-го года.</p>\n\n\n\n<p>Новый функционал, каждый год добавляемый в JS, проходит через четыре стадии рассмотрения. В этой статье мы обсудим тот функционал, который уже находится на 4-й стадии, то есть на последней и который уже был успешно добавлен в Google Chrome V8.</p>\n\n\n\n<p>Функционал, который мы будем обсуждать в этой статье:</p>\n\n\n\n<p><code>String.prototype.replaceAll</code></p>\n\n\n\n<p><code>Promise.any</code></p>\n\n\n\n<p>Логические операторы и выражения присваивания</p>\n\n\n\n<p>Числовые разделители</p>\n\n\n\n<p><code>Intl.ListFormat</code></p>\n\n\n\n<p><code>dateStyle</code> и <code>timeStyle</code> для <code>Intl.DateTimeFormat</code></p>\n\n\n\n<h2>String.prototype.replaceAll</h2>\n\n\n\n<p>В JavaScript метод <code>replace()</code> заменяет только первый совпадающий элемент в строке. Если нам понадобится заменить все совпадения, то мы сможем сделать только только с помощью регулярных выражений.</p>\n\n\n\n<p>Предложенный в ES2020 метод <code>replaceAll()</code> отдаёт новую строку, где все подходящие символы будут заменены на другие. Это могут быть строки или регулярные выражения, а заменять можно будет на строку или функцию, которая будет отрабатывать при каждом совпадении.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let str = 'I use linux, I love linux'\nstr = str.replaceAll('linux', 'windows');\n\nconsole.log(str)\n\n/****  Output  ****/\n// I use windows, I love windows</code></pre>\n\n\n\n<h2>Promise.any</h2>\n\n\n\n<p>В ES2020 нам представят метод <code>Promise.any()</code>, который резко останавливается и сразу отдаёт значение, как только выполнится первый промис из списка выполняемых промисов. Если выполнение всех промисов закончится неудачей, то будет выдана ошибка.</p>\n\n\n\n<p>Этот метод конечно же отличается от <code>Promise.race()</code> тем, что последний останавливается и выдает промис вне зависимости от результата его выполнения.</p>\n\n\n\n<p><strong>Пример 1а:</strong> Несмотря на то, что неудачно завершившийся промис заканчивает работу раньше, чем успешно завершившийся. <code>Promise.any()</code> отдаст первый из успешно завершившихся.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>Promise.any(&#91;\n  new Promise((resolve, reject) => setTimeout(reject, 200, 'Third')),\n  new Promise((resolve, reject) => setTimeout(resolve, 1000, 'Second')),\n  new Promise((resolve, reject) => setTimeout(resolve, 2000, 'First')),\n])\n.then(value => console.log(`Result: ${value}`))\n.catch (err => console.log(err))\n\n/****  Output  ****/\n// Result: Second</code></pre>\n\n\n\n<p><strong>Пример 1б:</strong> Когда все промисы неудачно завершаются, то выдает AggregatorError.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>Promise.any(&#91;\n  Promise.reject('Error 1'),\n  Promise.reject('Error 2'),\n  Promise.reject('Error 3')\n])\n.then(value => console.log(`Result: ${value}`))\n.catch (err => console.log(err))\n\n/****  Output  ****/\n// AggregateError: All promises were rejected\n</code></pre>\n\n\n\n<h2><strong>Логические операторы и выражения присваивания</strong></h2>\n\n\n\n<p>В JavaScript существует много выражений присваивания и логических операторов, например как тут:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Выражение присвивания\nlet num = 5\nnum+=10\nconsole.log(num) // 15\n\n// Логический оператор\nlet num1 = 6\nlet num2 = 3\nconsole.log(num1 === 6 &amp;&amp; num2 === 2) // false\nconsole.log(num1 === 6 || num2 === 2) // true</code></pre>\n\n\n\n<p>С помощью нового функционала мы сможем комбинировать логические операторы и выражения присваивания. Ниже вы увидите несколько примеров с <code>&amp;&amp;</code>, <code>||</code> и <code>??</code>:</p>\n\n\n\n<h3>Логический оператор назначения с &amp;&amp;</h3>\n\n\n\n<p>Тут мы выставляем значение левосторонней переменной только в том случае, если правая имеет значение <code>true</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let num1 = 5\nlet num2 = 10\n\nnum1 &amp;&amp;= num2\n\nconsole.log(num1) // 10\n\n// можно записать как\n// 1. num1 &amp;&amp; (num1 = num2)\n// 2. if (num1) num1 = num2</code></pre>\n\n\n\n<h3>Логический оператор назначения с ||</h3>\n\n\n\n<p>Тут мы выставляем значение <code>num1</code> на левую переменную только в том случае, если последняя будет <code>false</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let num1\nlet num2 = 10\n\nnum1 ||= num2\n\nconsole.log(num1) // 10\n\n// можно записать как\n// 1. num1 || (num1 = num2)\n// 2. if (!num1) num1 = num2</code></pre>\n\n\n\n<h3>Логический оператор назначения с ??</h3>\n\n\n\n<p>В ES2020 был представлен Nullish Coalescing оператор, который можно совмещать с оператором назначения. Он назначает правую переменную левой переменной только в случае, если последняя имеет значение <code>undefined</code> или <code>null</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let num1\nlet num2 = 10\n\nnum1 ??= num2\nconsole.log(num1) // 10\n\nnum1 = false\nnum1 ??= num2\nconsole.log(num1) // false\n\n// можно записать как\n// num1 ?? (num1 = num2)</code></pre>\n\n\n\n<h2><strong>Числовые разделители</strong></h2>\n\n\n\n<p>С приходом числовых разделителей станет куда проще читать и воспринимать числовые значения, применяя <code>_</code>(нижнее подчеркивание), раздавая разделители группам цифр. Для примера:</p>\n\n\n\n<pre class=\"wp-block-code\"><code>let number = 100_000 \n\nconsole.log(number)\n\n/****  Output  ****/\n// 100000</code></pre>\n\n\n\n<h2><strong>Intl.ListFormat</strong></h2>\n\n\n\n<p>Этот объект принимает два параметра, каждый из которых является опциональным. Первый это заданный язык(локаль), а второй это объект с параметрами у которых есть два свойства &#8212; стиль и тип.</p>\n\n\n\n<p><code>new Intl.ListFormat([locales[, options]])</code></p>\n\n\n\n<p>В <code>Intl.ListFormat</code> есть метод под названием <code>format()</code>, который получает массив как аргумент и форматирует его разными способами в зависимости от языка.</p>\n\n\n\n<p>Ниже есть несколько примеров в которых показаны различные комбинации для локалей.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const arr = &#91;'Pen', 'Pencil', 'Paper']\n\nlet obj = new Intl.ListFormat('en', { style: 'short', type: 'conjunction' })\nconsole.log(obj.format(arr)) \n\n/****  Output  ****/\n// Pen, Pencil, &amp; Paper\n\n\nobj = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' })\nconsole.log(obj.format(arr)) \n\n/****  Output  ****/\n// Pen, Pencil, and Paper\n\n\nobj = new Intl.ListFormat('en', { style: 'narrow', type: 'conjunction' })\nconsole.log(obj.format(arr)) \n\n/****  Output  ****/\n// Pen, Pencil, Paper\n\n\n// Итальянский\nobj = new Intl.ListFormat('it', { style: 'short', type: 'conjunction' })\nconsole.log(obj.format(arr)) \n\n/****  Output  ****/\n// Pen, Pencil e Paper\n\n\n// Немецкий\nobj = new Intl.ListFormat('de', { style: 'long', type: 'conjunction' })\nconsole.log(obj.format(arr)) \n\n/****  Output  ****/\n// Pen, Pencil und Paper</code></pre>\n\n\n\n<h2><strong>dataStyle и timeStyle опции для Intl.DateTimeFormat</strong></h2>\n\n\n\n<p><code>Intl.DateTimeFormat</code> это объект конструктор для объектов, которые включают в себя формат даты и отображения времени зависимые от используемого языка. &nbsp;<code>dateStyle</code>&nbsp;и&nbsp;<code>timeStyle</code> опции могут быть использованы для запроса специфического отображения даты или времени в заданной длине.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Только время в коротком формате\nlet o = new Intl.DateTimeFormat('en' , { timeStyle: 'short' })\nconsole.log(o.format(Date.now()))\n// 11:27 PM\n\n\n// Только время в обычном формате\no = new Intl.DateTimeFormat('en' , { timeStyle: 'medium'})\nconsole.log(o.format(Date.now()))\n// 11:27:57 PM\n\n\n// Время в расширенном формате\no = new Intl.DateTimeFormat('en' , { timeStyle: 'long' })\nconsole.log(o.format(Date.now()))\n// 11:27:57 PM GMT+11\n\n\n// Только дата в сокращенном формате\no = new Intl.DateTimeFormat('en' , { dateStyle: 'short'})\nconsole.log(o.format(Date.now()))\n// 10/6/20\n\n\n// Только дата в обычном формате\no = new Intl.DateTimeFormat('en' , { dateStyle: 'medium'})\nconsole.log(o.format(Date.now()))\n// Oct 6, 2020\n\n\n// Только дата в расширенном формате\no = new Intl.DateTimeFormat('en' , { dateStyle: 'long'})\nconsole.log(o.format(Date.now()))\n// October 6, 2020</code></pre>\n\n\n\n<p><code>dateStyle</code> и <code>timeStyle</code> используются вместе с разными лингвистическими тегами, как показано на примере ниже:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let abc\n\n// Английский\nabc = new Intl.DateTimeFormat('en' , { timeStyle: 'short', dateStyle: 'long'})\nconsole.log(abc.format(Date.now()))\n// October 6, 2020 at 11:40 PM\n\n\n// Итальянский\nabc = new Intl.DateTimeFormat('it' , { timeStyle: 'short', dateStyle: 'long'})\nconsole.log(abc.format(Date.now()))\n// 6 ottobre 2020 23:40\n\n\n// Немецкий\nabc = new Intl.DateTimeFormat('de' , { timeStyle: 'short', dateStyle: 'long'})\nconsole.log(abc.format(Date.now()))\n// 6. Oktober 2020 um 23:40</code></pre>\n","type":"js","date":"2020-10-23T15:22:12.000Z","acf":{"seo_desc":"В этой статье вы узнаете про интересные нововведения в JavaScript, которые ожидают нас в 2021 году.","keywords":"ES2021, ES12, replaceAll(), Promise.any,  новое в ES2021","pub_date":"2020-10-23","tags":"JavaScript, ES2021, Функции"},"title":"Интересные нововведения в JavaScript ES2021","id":"0e8c7ec4-a6d1-5af6-9cd0-692be5438131","excerpt":"<p>В этой статье вы узнаете про интересные нововведения в JavaScript, которые ожидают нас в 2021 году. Не все конечно, но в этой тут собраны и описаны самые интересные из них.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2020/10/DglYtvO7Bn0-2.jpg"},"interesting":[{"title":"Интересные нововведения в JavaScript ES2021","slug":"interesnie-novovvedeniya-v-javascript-es2021","type":"js"}]}},"staticQueryHashes":["3576131997","63159454"]}