<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ JavaScript - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/ukrainian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ JavaScript - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/ukrainian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 06 Jun 2026 19:41:08 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/ukrainian/news/tag/javascript/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Лексична область в JavaScript: що таке область в JS? ]]>
                </title>
                <description>
                    <![CDATA[ Термін «лексична область» на перший погляд може здатися неочевидним. Корисно було б розібрати значення цих слів окремо. Ця стаття пояснить лексичну область, спершу розібравши значення слів «лексична» та «область». Давайте почнемо з розбору значення слова «область». Що ж таке область? Область — це простір, в якому предмет (функція або змінна) ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/leksychna-oblast-v-javascript-shcho-take-oblast-v-js/</link>
                <guid isPermaLink="false">64c93fdaae608205b21f6c88</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Lysak ]]>
                </dc:creator>
                <pubDate>Thu, 03 Aug 2023 08:22:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/08/kristina-tripkovic-EGmwwDzme6s-unsplash-javascript-lexical-scope-codesweetly.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/javascript-lexical-scope-tutorial/#what-is-a-scope-chain" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Lexical Scope in JavaScript – What Exactly Is Scope in JS?</a>
      </p><p>Термін <strong>«лексична область» </strong>на перший погляд може здатися неочевидним. Корисно було б розібрати значення цих слів окремо.</p><p>Ця стаття пояснить лексичну область, спершу розібравши значення слів «лексична» та «область».</p><p>Давайте почнемо з розбору значення слова «область».</p><h2 id="-"><strong>Що ж таке область?</strong></h2><p><strong>Область </strong>— це <em>простір</em>,<em> </em>в якому предмет (функція або змінна) є видимим та доступним для решти <a href="https://codesweetly.com/document-vs-data-vs-code/">коду</a>.</p><p><strong>Зверніть увагу:</strong></p><ul><li><strong>Область </strong>— це територія, простір або регіон.</li><li><strong>Глобальна область</strong> — це глобальний простір (або публічний).</li><li><strong>Локальна область</strong> — це місцевий простір (або обмежений).</li></ul><p><strong>Ось приклад:</strong></p><pre><code class="language-js">// Визначення змінної в глобальній області:
const fullName = "Oluwatobi Sofela";

// Визначення вкладених функцій:
function profile() {
  function sayName() {
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p><a href="https://stackblitz.com/edit/web-platform-fqqxjl?file=script.js"><strong>Спробуйте на StackBlitz</strong></a></p><p>У фрагменті вище ми визначили змінну <code>fullName</code> в глобальній області. Через це вона є видимою та доступною глобально всьому коду всередині цього скрипту.</p><p>Але ми визначили <code>writeName()</code> всередині функції <code>sayName()</code>, тому <code>writeName()</code> перебуває в локальній області <code>sayName()</code>.</p><p>Не забувайте, що кожен раз, коли ми викликаємо функцію <code>writeName()</code>, комп’ютер <em>не</em> піде до глобальної області, щоб викликати змінну <code>fullName</code>. Натомість, він послідовно пройде через ланцюг областей, шукаючи <code>fullName</code>.</p><h2 id="--1"><strong>Що таке ланцюг областей?</strong></h2><p><strong>Ланцюгом областей </strong>називають <em>унікальні </em>простори, які існують поза областю, де змінну <em>викликали </em>до глобальної області.</p><p><strong>Для прикладу:</strong></p><pre><code class="language-js">// Визначення змінної в глобальній області:
const fullName = "Oluwatobi Sofela";

// Визначення вкладених функцій:
function profile() {
  function sayName() {
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p>Зверніть увагу, в фрагменті вище змінна <code>fullName</code> була викликана з області функції <code>writeName()</code>.</p><p>Тому ланцюг областей, який існує від виклику змінної до глобальної області, виглядатиме так:</p><p><strong>Область writeName() ---&gt; область sayName() ---&gt; область profile() ---&gt; глобальна область</strong></p><p>Іншими словами, від області виклику змінної <code>fullName</code> до її лексичної області (в даному випадку <em>глобальної області</em>) знаходяться чотири інших областей.</p><p><strong>Зверніть увагу: </strong>глобальна область є останньою ланкою в ланцюгу областей <a href="https://www.codesweetly.com/html-css-javascript/">JavaScript</a>.</p><h2 id="--2"><strong>Як працює ланцюг областей?</strong></h2><p>Ланцюг областей JavaScript визначає ієрархію областей, через які має пройти комп’ютер, щоб знайти лексичну область конкретної функції, яка була викликана.</p><p>Для прикладу розглянемо такий код:</p><pre><code class="language-js">// Визначення змінної в глобальній області:
const fullName = "Oluwatobi Sofela";

// Визначення вкладених функцій:
function profile() {
  function sayName() {
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p>У фрагменті вище, кожен раз при виклику функції <code>profile()</code>, комп’ютер спочатку викликатиме функцію <code>sayName()</code>, яка є єдиним кодом всередині функції <code>profile()</code>.</p><p>Після цього комп’ютер викликатиме функцію <code>writeName()</code>, яка є єдиним кодом всередині функції <code>sayName()</code>.</p><p>Тепер, оскільки код всередині <code>writeName()</code> каже комп’ютеру викликати та повернути вміст змінної <code>fullName</code>, комп’ютер викличе <code>fullName</code>. Але комп'ютер не піде напряму до глобальної області, щоб викликати <code>fullName</code>.</p><p>Натомість комп’ютер <em>крок за кроком</em> проходить через <em>ланцюг областей, </em>щоб знайти <em>лексичну область </em>змінної <code>fullName</code>.</p><p>Ось послідовність кроків, які має зробити комп’ютер, щоб знайти лексичну область змінної <code>fullName</code>:</p><ol><li>Комп’ютер провірить, чи змінна <code>fullName</code> була визначена локально всередені функції <code>writeName()</code>. Але він не знайде визначення <code>fullName</code> тут, тому він рухається до наступної області, щоб продовжити свої пошуки.</li><li>Комп’ютер шукатиме визначення <code>fullName</code> всередині <code>sayName()</code> (це наступна область в ланцюгу). Він не знайде визначення змінних тут, тому далі рухається вверх по ланцюгу.</li><li>Комп’ютер шукатиме визначення <code>fullName</code> у функції <code>profile()</code>. Визначення <code>fullName</code> тут немає. Комп’ютер далі шукає лексичну область змінної <code>fullName</code> в наступній частині ланцюга областей.</li><li>Комп’ютер доходить до <em>глобальної області</em> (наступна область після <code>profile()</code>). На щастя, він знаходить визначення <code>fullName</code>! Як наслідок, комп’ютер отримає вміст змінної (<code>"Oluwatobi Sofela"</code>) і поверне його.</li></ol><h2 id="--3"><strong>Час попрактикуватися з областю 🤸‍♂️🏋️‍♀️🏊‍♀️</strong></h2><p>Розглянемо код. Яку з трьох змінних <code>fullName</code> викличе комп’ютер?</p><pre><code class="language-js">// Спочатку змінна fullName визначається в глобальній області:
const fullName = "Oluwatobi Sofela";

// Вкладені функції, які містять ще дві змінні fullName:
function profile() {
  const fullName = "Tobi Sho";
  function sayName() {
    const fullName = "Oluwa Sofe";
    function writeName() {
      return fullName;
    }
    return writeName();
  }
  return sayName();
}</code></pre><p>Комп’ютер викличе першу, другу чи третю змінну <code>fullName</code>?</p><p><strong>Зверніть увагу: </strong>ви візьмете від цієї статті набагато більше, якщо випробуєте надані приклади на власній практиці.</p><p>Якщо у вас не буде виходити, не засмучуйтесь. Натомість, перегляньте урок та спробуйте ще раз.</p><p>Продовжуйте лише після того, як виклались на всі сто (якщо ви змухлюєте або проігноруєте цей крок, ви зробите гірше для себе!).</p><h2 id="--4"><strong>Впоралися?</strong></h2><p>Серед трьох визначень <code>fullName</code>, що представлені в коді вище, комп’ютер викличе та поверне ту змінну, яка визначена у функції <code>sayName()</code>.</p><p>Змінна <code>fullName</code> всередині <code>sayName()</code> буде викликана, тому що <code>sayName()</code> є першою областю, в якій комп’ютер знайде визначення <code>fullName</code>.</p><p>Тому, якщо викликати <code>profile()</code>, поверненим значенням буде <code>"Oluwa Sofe"</code>.</p><p><strong><a href="https://stackblitz.com/edit/web-platform-9mpvfv?file=script.js">Спробуйте на StackBlitz</a></strong></p><p><strong>Запам’ятайте:</strong></p><ul><li>Уявімо, що комп’ютер не знайде визначення <code>fullName</code> у жодній області. В такому випадку комп’ютер поверне <code>Uncaught ReferenceError: fullName is not defined</code>.</li><li>Глобальна область завжди є останньою в ланцюгу областей. Іншими словами, глобальна область — це те місце, де закінчуються всі пошуки.</li><li>Внутрішня область (нащадок) має доступ до батьківської (зовнішньої) області, але зовнішня область не має доступу до області-нащадка. Наприклад, у фрагменті вище функція <code>writeName()</code> має доступ до коду всередині будь-якої батьківської області (<code>sayName()</code>, <code>profile()</code> або <em>глобальної області</em>). Однак <code>sayName()</code>, <code>profile()</code> та <em>глобальна область</em> не мають доступу до коду всередині <code>writeName()</code>.</li></ul><h2 id="--5"><strong>Швидкий огляд того, що ми вивчили</strong></h2><p>Область в JavaScript — це про простір.</p><p>Тому наступного разу, коли партнер запрошує вас у свою особисту область, пам’ятайте, що вони запрошують вас у свій особистий простір 😜!</p><p>Коли прибудете туди, не забудьте попросити їх продемонструвати лексичні вміння...</p><p>Ви питаєте, що означає «лексичний»? Давайте розберемося.</p><h2 id="--6"><strong>Що означає «лексичний»?</strong></h2><p><strong>Лексичний </strong>—<strong> </strong>це про визначення речей.</p><p>Все, що пов’язано зі створенням слів, виразів або змінних, є <em>лексичним</em>.</p><p>Наприклад, гра <a href="https://uk.wikipedia.org/wiki/Скрабл">scrabble</a> є лексичною активністю, оскільки вона пов’язана зі створенням слів.</p><p>Також особа, робота якої пов’язана з лінгвістикою (дослідженням мов), має лексичну кар’єру.</p><p><strong>Зверніть увагу: </strong>другою назвою словника є <em>лексикон</em>. Іншими словами, лексикон — це словник, в якому перераховані та визначені слова.</p><p>Тепер, коли ми розуміємо значення слів «лексична» та«область», ми можемо говорити про <strong>лексичну область</strong>.</p><h2 id="-javascript"><strong>Що таке лексична область в JavaScript?</strong></h2><p><strong>Лексична область</strong> — це область <em>визначення</em> виразу.</p><p>Іншими словами, лексична область предмету — це місце, в якому предмет було <em>створено.</em></p><p><strong>Зверніть увагу:</strong></p><ul><li>Інакшою назвою для лексичної області є <em>статична область</em>.</li><li>Місце, де предмет був викликаним, не завжди є лексичною областю предмета. Натомість <em>область визначення </em>предмету є його лексичною областю.</li></ul><h3 id="--7"><strong>Приклад лексичної області:</strong></h3><p>Розглянемо такий код:</p><pre><code class="language-js">// Визначення змінної в глобальній області:
const myName = "Oluwatobi";

// Виклик змінної myName всередині функції:
function getName() {
  return myName;
}</code></pre><p>Зверніть увагу, що у наведеному фрагменті ми <em>визначили </em>змінну <code>myName</code> в глобальній області та <em>викликали </em>її всередині функції <code>getName()</code>.</p><p><strong>Питання: </strong>який з двох просторів є лексичною областю змінної <code>myName</code>? Це <em>глобальна область<strong> </strong></em>чи локальна область функції <code>getName()</code>?</p><p><strong>Відповідь:</strong> не забувайте, що <em>лексична область — </em>це <em>простір визначення</em>, а не <em>простір виклику</em>. Тому лексичною областю змінної <code>myName</code> є <em>глобальна область, </em>оскільки ми визначили <code>myName</code> в глобальному середовищі.</p><h3 id="--8"><strong>Ще один приклад лексичної області</strong></h3><pre><code class="language-js">function getName() {
  const myName = "Oluwatobi";
  return myName;
}</code></pre><p><strong>Питання:</strong> де знаходиться лексична область <code>myName</code>?</p><p><strong>Відповідь: </strong>зверніть увагу, що ми створили та викликали змінну <code>myName</code> всередині <code>getName()</code>. Тому лексичною областю <code>myName</code> є локальне серидовище <code>getName()</code>, оскільки <code>getName()</code> є простором визначення <code>myName</code>.</p><h2 id="--9"><strong>Як працює лексична область?</strong></h2><p>Область визначення виразу JavaScript визначає, який код має доступ до нього.</p><p>Іншими словами, лише код всередині лексичної області предмету має доступ до цього предмету.</p><p>Наприклад, розглянемо такий код:</p><pre><code class="language-js">// Визначення функції:
function showLastName() {
  const lastName = "Sofela";
  return lastName;
}

// Визначення іншої функції:
function displayFullName() {
  const fullName = "Oluwatobi " + lastName;
  return fullName;
}

// Виклик функції displayFullName():
console.log(displayFullName());

// Виклик функції вище поверне:
Uncaught ReferenceError: lastName is not defined</code></pre><p>Зверніть увагу, що виклик функції <code>displayFullName()</code> у фрагменті вище повернув <code>Uncaught ReferenceError</code>. Помилка повертається, бо лише код всередині лексичної області предмету може мати доступ до предмету.</p><p>Як наслідок, ані функція <code>displayFullName()</code>, ані її внутрішній код не мають доступу до змінної <code>lastName</code>, оскільки <code>lastName</code> була визначена в іншій області.</p><p>Іншими словами, лексична область змінної <code>lastName</code> відрізняється від області змінної <code>displayFullName()</code>.</p><p>Простір визначення <code>lastName</code> знаходиться у <code>showLastName()</code>, якщо лексична область <code>displayFullName()</code> — це глобальне серидовище.</p><p>Тепер розглянемо інший код:</p><pre><code class="language-js">// Визначення функції:
function showLastName() {
  const lastName = "Sofela";
  return lastName;
}

// Визначення іншої функції:
function displayFullName() {
  const fullName = "Oluwatobi " + showLastName();
  return fullName;
}

// Виклик функції displayFullName():
console.log(displayFullName());

// Виклик функції вище поверне:
"Oluwatobi Sofela"</code></pre><p>У фрагменті вище <code>displayFullName()</code> успішно повернула <code>"Oluwatobi Sofela"</code>, оскільки <code>displayFullName()</code> та <code>showLastName()</code> знаходяться в одній лексичній області.</p><p>Іншими словами, <code>displayFullName()</code> може викликати <code>showLastName()</code>, бо обидві функції визначено в глобальній області.</p><p><strong>Зверніть увагу:</strong></p><ul><li>У другому прикладі <code>displayFullName()</code> не отримала доступу до змінної <code>lastName</code> всередині <code>showLastName()</code>. Натомість <code>displayFullName()</code> викликала <code>showLastName()</code>, яка потім повернула вміст змінної <code>lastName</code>.</li><li>Альтернативою лексичої області є динамічна область, але вона рідко використовується в програмуванні. Лише декілька мов, наприклад bash, використовують динамічну область.</li></ul><h2 id="--10"><strong>Висновок</strong></h2><p>Кожен раз, коли ви чуєте «лексична», думайте про визначення.</p><p>Тобто лексична область машини, змінної, телефону, функції або купальника — це місце походження.</p><h2 id="--11"><strong>Огляд</strong></h2><p>У цій статті описано лексичну область в <a href="https://www.codesweetly.com/html-css-javascript/">JavaScript</a>. Також пояснено, чому це важливе поняття в програмуванні.</p><p>Дякую за увагу!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Лексична область в JavaScript: довідник початківця ]]>
                </title>
                <description>
                    <![CDATA[ У цій статті ми дізнаємось, що таке лексична область видимості, розглянувши декілька корисних прикладів. Також ми обговоримо, яким чином JavaScript компілює та виконує програми. Вкінці ми поговоримо про те, яким чином можна використовувати лексичну область для пояснення помилок неоголошених змінних чи посилання. Без зайвих слів, почнемо. Зміст  * Як ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/leksychna-oblast-v-javascript-dovidnyk-pochatkivtsya/</link>
                <guid isPermaLink="false">64c7d821ae608205b21f664e</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Lysak ]]>
                </dc:creator>
                <pubDate>Tue, 01 Aug 2023 11:17:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/08/spacex--p-KCm6xB9I-unsplash-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/lexical-scope-in-javascript/#syntax-error" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Lexical Scope in JavaScript – Beginner's Guide</a>
      </p><p>У цій статті ми дізнаємось, що таке лексична область видимості, розглянувши декілька корисних прикладів.</p><p>Також ми обговоримо, яким чином JavaScript компілює та виконує програми.</p><p>Вкінці ми поговоримо про те, яким чином можна використовувати лексичну область для пояснення помилок неоголошених змінних чи посилання.</p><p>Без зайвих слів, почнемо.</p><h2 id="-"><strong>Зміст</strong></h2><ul><li><a href="#як-javascript-виконує-програми">Як JavaScript виконує програми?</a></li><li><a href="#як-javascript-парсить-компілює-та-виконує-код">Як JavaScript парсить/компілює та виконує код</a></li><li><a href="#синтаксична-помилка">Розуміння помилки синтаксису</a></li><li><a href="#піднесення-змінних-та-функцій">Розуміння піднесення змінних та функцій</a></li><li><a href="#що-таке-лексична-область">Що таке лексична область?</a></li><li><a href="#розуміння-лексичної-області">Розуміння лексичної області</a></li><li><a href="#підсумки">Підсумки</a></li></ul><!--kg-card-begin: html--><h2 id="як-javascript-виконує-програми">Як JavaScript виконує програми?</h2><!--kg-card-end: html--><p>Перед тим як розбиратися, як JavaScript виконує код/програму, ми розглянемо різні кроки, що залучені у будь-якому процесі компіляції з точки зору теорії компілятора.</p><p>Для будь-якої мови компілятор виконує такі операції:</p><h3 id="--1"><strong>Токенізація/лексування</strong></h3><p>Під час цього процесу вся програма розділяється на ключові слова, які називаються токенами. Наприклад, розглянемо інструкцію <code>let temp = 10</code>: коли виконується токенізація, вона ділить інструкцію на такі ключові слова: <code>let</code>, <code>temp</code>, <code>=</code>, <code>10</code>.</p><p>Лексування та токенізація є взаємозамінними термінами, але між ними є невелика різниця. Лексування — це процес токенізації, який також перевіряє, чи він сам має розглядатися як окремий токен. Ми можемо вважати <strong>лексування «</strong>розумною» версією токенізації.</p><h3 id="--2"><strong>Парсинг</strong></h3><p>Це процес збирання всіх токенів, згенерованих під час попереднього кроку та їх перетворення у структуру вкладеного дерева, що представляє код з граматичної точки зору.</p><p>Цю структуру дерева називають абстрактним синтаксичним деревом (AST).</p><h3 id="--3"><strong>Генерування коду</strong></h3><p>Цей процес конвертує AST у код, який може прочитати машина.</p><p>Це був короткий огляд того, як компілятор працює та генерує машинний код.</p><p>Звісно, в компіляції є більше кроків ніж описано вище, але опис інших кроків компіляції знаходиться поза темою цієї статті.</p><p>Найважливішим спостереженням щодо виконання коду JavaScript є той факт, що в межах виконання коду відбуваються дві фази:</p><ol><li>Парсинг</li><li>Виконання</li></ol><p>Перед тим, як ми перейдемо до лексичної області, важливо розуміти, як JavaScript виконує програму. У наступному розділі ми детальніше розберемо, як працюють ці дві фази.</p><!--kg-card-begin: html--><h2 id="як-javascript-парсить-компілює-та-виконує-код">Як JavaScript парсить/компілює та виконує код</h2><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Untitled.png" class="kg-image" alt="Untitled" width="600" height="400" loading="lazy"><figcaption>Фаза парсингу</figcaption></figure><p>Спочатку обговоримо фазу парсингу. Під час цієї фази двигун JavaScript оглядає всю програму, призначає змінні до відповідних областей та перевіряє наявність помилок. Якщо він знаходить помилку, виконання програми зупиняється.</p><p>Під час наступної фази відбувається виконання коду.</p><p>Для того, щоб краще зрозуміти цей процес, розглянемо детальніше два сценарії:</p><ul><li>Синтаксична помилка</li><li>Піднесення змінної</li></ul><!--kg-card-begin: html--><h3 id="синтаксична-помилка">Синтаксична помилка</h3><!--kg-card-end: html--><p>Найкращий та найпростіший спосіб показати, як JS спочатку парсить, а потім виконує програму, — показати поведінку синтаксичної помилки.</p><p>Розглянемо такий помилковий код:</p><pre><code class="language-javascript">const token = "ABC";
console.log(token);

//Синтаксична помилка:
const newToken = %((token);</code></pre><p>Програма вище видасть синтаксичну помилку в останньому рядку. Помилка буде виглядати ось так:</p><pre><code class="language-javascript">Uncaught SyntaxError: Unexpected token '%'
</code></pre><p>JavaScript не виконує <code>console.log</code>. Натомість він проходить через всю програму наступним чином:</p><ul><li>Рядок 1: знайдено оголошення та визначення змінної. Збережено посилання на змінну <code>token</code> в поточній області, яка є глобальною.</li><li>Рядок 2: двигун JavaScript побачив, що змінна <code>token</code> використовується. Спочатку він звертається до поточної області з метою перевірити, чи присутня змінна <code>token</code>. Якщо вона присутня, то посилається на оголошення змінної <code>token</code>.</li><li>Рядок 3: двигун побачив, що змінна <code>newToken</code> була оголошена та визначена. Він перевірив, чи змінна під назвою <code>newToken</code> вже існувала у поточній області. Якщо так, двигун видає помилку посилання. Якщо ні, двигун зберігає посилання на цю змінну в поточній області.</li><li>У тому ж рядку двигун побачив, що він намагався посилатися на змінну <code>%((token)</code>. Також він помітив, що назва почалася з символу <code>%</code>, а назви змінних не можуть починатися з резервованих ключових слів, тому двигун видав синтаксичну помилку.</li></ul><!--kg-card-begin: html--><h3 id="піднесення-змінних-та-функцій">Піднесення змінних та функцій</h3><!--kg-card-end: html--><p>Піднесення — це механізм, завдяки якому всі змінні у своїх відповідних областях «підіймаються», тобто стають доступними зверху.</p><p>Поглянемо на приклад нижче, який покаже, що піднесення відбувається під час фази парсингу і потім відбувається виконання:</p><pre><code class="language-javascript">doSomething();

function doSomething(){
	console.log("How you doing?");
}</code></pre><p>В прикладі вище, двигун проходить всю програму у такій послідовності:</p><ul><li>Рядок 1: двигун JavaScript потрапив нa функцію під назвою <code>doSomething</code>. Він перевірив, чи <code>doSomething</code> доступна в поточній області. Якщо так, він посилається на функцію, в інакшому випадку він видає помилку посилання.</li><li>Виявилось, що під час фази парсину двигун знайшов <code>function doSomething</code> у поточній області. Як наслідок, він додав посилання на змінну в поточну область та зробив її доступною в межах всієї програми.</li><li>Вкінці функція <code>doSomething</code> друкує рядок <code>How you doing?</code>.</li></ul><p>Виходячи з пояснення вище, спочатку код парсувався, щоб згенерувати проміжний код, який забезпечує доступ до посилання на змінні та функції в поточній області.</p><p>В наступній фазі JavaScript знає про існування функції та починає її виконувати.</p><p>З прикладів наведених вище, ми можемо впевнено дійти до висновку, що двигун JavaScript робить наступні кроки перед виконанням коду:</p><ol><li>Парсить код.</li><li>Генерує проміжний код, що описує доступні змінні та функції.</li><li>Використовуючи цей проміжний код, двигун починає виконання програми.</li></ol><!--kg-card-begin: html--><h2 id="що-таке-лексична-область">Що таке лексична область?</h2><!--kg-card-end: html--><p>Процес визначення областей змінних та функцій під час виконання називається лексичною областю. Слово <em>лексична </em>походить від <em>лексичної фази/фази токенізації </em>компіляції JavaScript.</p><p>Протягом часу виконання JavaScript робить дві дії: <code>парсинг</code> та <code>виконання</code>. Як ми дізналися в попередньому розділі, під час фази парсингу визначаються області змінних та функцій. Тому й було важливо спочатку зрозуміти, як працює фаза парсингу у виконанні коду, оскільки вона закладає фундамент для розуміння лексичної області.</p><p>Простими словами, під час фази парсингу відбувається створення лексичної області.</p><p>Тепер, коли ми знаємо основи, розглянемо основні характеристики лексичної області:</p><p>По-перше, під час фази парсингу, область призначається/посилається на змінну там, де вона оголошена. </p><p>Наприклад, розглянемо сценарій, коли змінна згадується у внутрішній функції, а її оголошення знаходиться в глобальній області. У цьому випадку внутрішня змінна призначена з зовнішньою областю, що є глобальною областю.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/ezgif.com-gif-maker--1---1-.gif" class="kg-image" alt="ezgif.com-gif-maker--1---1-" width="600" height="400" loading="lazy"><figcaption>Ілюстрація призначення області</figcaption></figure><p>Потім, під час призначення області до змінної, двигун JavaScript перевіряє батьківські області на наявність змінної.</p><p>Якщо змінна присутня, батьківська область застосовується до змінної. Якщо змінна не знайдена в цих областях, двигун видає помилку посилання.<br><br>Поглянемо на ілюстрацію знизу, яка показує, як відбувається пошук області змінної.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/ezgif.com-gif-maker--3---1-.gif" class="kg-image" alt="ezgif.com-gif-maker--3---1-" width="600" height="400" loading="lazy"><figcaption>Двигун JS успішно знаходить змінну, проглядаючи кожну область</figcaption></figure><p>А ця ілюстрація показує, як двигун JS намагається знайти змінну, яка не існує в жодній області:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/ezgif.com-gif-maker--6---1-.gif" class="kg-image" alt="ezgif.com-gif-maker--6---1-" width="600" height="400" loading="lazy"><figcaption>Двигун JS видає помилку посилання</figcaption></figure><!--kg-card-begin: html--><h2 id="розуміння-лексичної-області">Розуміння лексичної області</h2><!--kg-card-end: html--><p>У розділі вище ми дали визначення лексичній області. Також ми розібралися з її характеристиками.</p><p>У цьому розділі ми розглянемо лексичну область на прикладі. Як то кажуть, складні теми завжди легше зрозуміти на реальних прикладах.</p><p>Приклад, який ми розглянемо, полягає у забарвленні часток коду, які мають схожі області. Звучить незрозуміло, але дозвольте продемонструвати простою ілюстрацією.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Global-and-Functional-Scope--1---1-.gif" class="kg-image" alt="Global-and-Functional-Scope--1---1-" width="600" height="400" loading="lazy"><figcaption>Поняття лексичної області за допомогою кольорового прикладу</figcaption></figure><p>Розберемо, що відбувається на цій ілюстрації.</p><p>У нашій програмі знаходяться:</p><ul><li><code>empData</code>: масив об’єктів.</li><li><code>allPositions</code>: масив рядків що описує посади працівників.</li><li>Інструкція, яка друкує змінні <code>allPositions</code>.</li></ul><p>Тепер поглянемо, що відбувається під час фази парсингу цієї програми:</p><ul><li>Двигун починає з першого рядка і він потрапляє на оголошення змінної <code>empData</code>.</li><li>Потім двигун провіряє, чи <code>empData</code> доступна в поточній області. Оскільки схожої змінної не знайдено, він шукає наявність цієї змінної в батьківських областях.</li><li>Двигун зупиняє свій пошук, оскільки немає доступних областей і поточна область є глобальною.</li><li>Далі двигун призначає значення <code>undefined</code> до змінної <code>empData</code> під час фази парсингу, щоб у випадку, коли щось у внутрішніх областях намагається посилатися на змінну, її можна було викликати.</li><li>Права частина оператора присвоєння «розв’язується» під час фази виконання програми.</li><li>Подібним чином двигун присвоює значення <code>undefined</code> до змінної <code>allPositions</code>.</li><li>Але на правій частині ми також посилаємось на змінну <code>empData</code>. На цьому етапі двигун провіряє, чи змінна доступна в поточній області. Оскільки вона доступна, на неї далі йде посилання (тобто вона доступна у глобальній області).</li><li>Двигун досі на правій частині оператора присвоєння, бо він помітив стрілкову функцію всередині функції «map». Оскільки двигун натрапив на визначення функції, він створює нову область. В ілюстрації ця область позначена цифрою 2. </li><li>Оскільки це нова область, ми даємо їй чорний колір.</li><li>Ця стрілкова функція має аргумент <code>data</code> та повертає <code>data.position</code>. У фазі парсингу, двигун підіймає всі потрібні змінні, посилавшись на змінні, доступні в поточній області, а також батьківській.</li><li>Всередині цієї функції згадується змінна <code>data</code>, тому двигун провіряє, чи поточна область має цю змінну. Оскільки змінна присутня в поточній області, посилання йде туди ж.</li><li>Коли двигун потрапляє на фігурну дужку <code>}</code>, він покидає функціональну область.</li><li>Вкінці програми знаходиться інструкція, яка друкує змінні <code>allPositions</code>. Оскільки згадується змінна <code>allPositions</code>, двигун шукає її в поточній області (тобто глобальній області). Оскільки вона знайдена, вона посилається туди ж в інструкції <code>console</code>.</li></ul><!--kg-card-begin: html--><h2 id="підсумки">Підсумки</h2><!--kg-card-end: html--><p>У цій статті ми ознайомилися з лексичною областю та розібралися, як вона працює, розглянувши простий приклад з забарвленням.</p><p>Дякую, що прочитали!</p><p>Підпишіться на мене у <a href="https://twitter.com/keurplkar">твіттері</a>, <a href="https://github.com/keyurparalkar">GitHub</a> та <a href="https://www.linkedin.com/in/keyur-paralkar-494415107/">LinkedIn</a>.</p><h2></h2><p></p><h2></h2><h3></h3><h2></h2><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Як читати файл JSON у JavaScript: читання JSON у JS ]]>
                </title>
                <description>
                    <![CDATA[ Під час отримання даних із зовнішніх джерел або серверів потрібно переконатися, що дані, які повертаються, мають формат JSON. Тоді ви можете використовувати їх у своїй програмі. У деяких ситуаціях, працюючи локально або під час завантаження файлів даних на сервер, ми можемо забажати прочитати ці дані JSON із файлу. Ми дізнаємося, ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/yak-chytaty-fayl-json-u-javascript-chytannya-json-u-js/</link>
                <guid isPermaLink="false">6402089fd125780651a3bbad</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Fri, 10 Mar 2023 03:11:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/03/cover-template--5-.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/how-to-read-json-file-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Read a JSON File in JavaScript – Reading JSON in JS</a>
      </p><p>Під час отримання даних із зовнішніх джерел або серверів потрібно переконатися, що дані, які повертаються, мають формат JSON. Тоді ви можете використовувати їх у своїй програмі.</p><p>У деяких ситуаціях, працюючи локально або під час завантаження файлів даних на сервер, ми можемо забажати прочитати ці дані JSON із файлу.</p><p>Ми дізнаємося, як це зробити в цьому посібнику.</p><h2 id="-json-javascript-fetch-api"><strong>Як читати файл JSON у JavaScript за допомогою Fetch API</strong></h2><p>Одним із стандартних методів, який ми можемо використовувати для читання файлу JSON (локального файлу, або файлу, завантаженого на сервер), є Fetch API. Він використовує однаковий синтаксис для обох випадків. Єдиною відмінністю буде URL-адреса.</p><p>Наприклад, припустімо, що у папці нашого проєкту є локальний файл під назвою <code>data.json</code>, який містить такі дані JSON:</p><pre><code class="language-json">&lt;!--./data.JSON--&gt;

{
    "id": 1,
    "title": "Hello World",
    "completed": false
}
</code></pre><p>Тепер ми можемо прочитати цей файл у JavaScript за допомогою методу Fetch API:</p><pre><code class="language-js">&lt;!--./index.js--&gt;

fetch('./data.json')
    .then((response) =&gt; response.json())
    .then((json) =&gt; console.log(json));
</code></pre><p>У наведеному вище прикладі ми змогли прочитати локальний файл JSON. Але, на жаль, коли ми запускаємо це в браузері, ми можемо отримати таку помилку CORS (<em>укр. </em>спільне використання ресурсів різними джерелами), оскільки наш файл не знаходиться на сервері:</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image.png" class="kg-image" alt="s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image" width="600" height="400" loading="lazy"></figure><p>Щоб виправити це, ми переконаємося, що наш файл JSON знаходиться на локальному або віддаленому сервері. Якщо ми використовуємо Live-сервер у нашій IDE, все буде нормально. Але коли ми безпосередньо завантажуємо наш файл, ми отримуємо цю помилку.</p><p>І як я вже говорив раніше, припустімо, що у нас є файл JSON на віддаленому сервері, і ми намагаємося прочитати цей файл у JavaScript. Той самий синтаксис буде працювати:</p><pre><code class="language-js">&lt;!--./index.js--&gt;

fetch('https://server.com/data.json')
    .then((response) =&gt; response.json())
    .then((json) =&gt; console.log(json));
</code></pre><p>Fetch API є кращим методом для використання, коли ми хочемо прочитати файл JSON із зовнішнього сервера або локального файлу в наш файл JavaScript.</p><h2 id="-json-javascript-import"><strong>Як прочитати файл JSON у JavaScript за допомогою оператора import</strong></h2><p>Інший метод, який ми можемо використати окрім створення запиту HTTP, є оператор import. Цей метод має кілька ускладнень, але ми розглянемо їх.</p><p>Як і в попередньому розділі, припустімо, що у нас є файл JSON, який містить дані користувача (наприклад, <code>user.json</code>):</p><pre><code class="language-json">&lt;!--./user.JSON--&gt;

{
    "id": 1,
    "name": "John Doe",
    "age": 12
}
</code></pre><p>Ми можемо прочитати ці дані JSON у JavaScript за допомогою оператора імпорту таким чином:</p><pre><code class="language-js">&lt;!---./index.js--&gt;

import data from './data.json';
console.log(data);
</code></pre><p>На жаль, це викличе помилку, що ми не можемо використовувати оператор <code>import</code> поза модулем. Це стандартна помилка, коли ми намагаємося використати оператор <code>import</code> у звичайному файлі JavaScript, особливо для розробників, які не знайомі з JavaScript.</p><p>Щоб виправити це, ми можемо додати тег script <code>type="module"</code> в наш файл HTML, де ми посилалися на файл JavaScript, наприклад:</p><pre><code class="language-html">&lt;html lang="en"&gt;
    // ...
    &lt;body&gt;
        &lt;script type="module" src="./index.js"&gt;&lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Коли ми це зробимо, ми все одно отримаємо іншу помилку:</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659465574774_image.png" class="kg-image" alt="s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659465574774_image" width="600" height="400" loading="lazy"></figure><p>Щоб виправити вже цю помилку, нам потрібно додати тип файлу JSON до оператора <code>import</code>, і тоді ми зможемо прочитати наш файл JSON у JavaScript:</p><pre><code class="language-undefined">import data from './data.json' assert { type: 'JSON' };
console.log(data);
</code></pre><p>Це ідеально працює, якщо ми запускаємо наші файли на локальному або віддаленому сервері. Але припустімо, що ми запускаємо це локально — тоді ми отримаємо помилку CORS.</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image.png" class="kg-image" alt="s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image" width="600" height="400" loading="lazy"></figure><h2 id="-"><strong>Підбиваючи підсумки</strong></h2><p>У цій статті ми дізналися, як читати файл JSON у JavaScript і можливі помилки, з якими ми можемо зіткнутися під час використання кожного методу.</p><p>Найкраще використовувати метод fetch API, коли ви хочете зробити запит HTTP. Наприклад, припустімо, що ми отримуємо дані з фальшивого файлу JSON, який ми зрештою витягнемо з API.</p><p>Тим не менш, у ситуації, коли нам не потрібно використовувати запит HTTP, ми можемо використати оператор <code>import</code>. Ми можемо використовувати &nbsp;<code>import</code>, коли використовуємо такі бібліотеки, як React та Vue, які мають відношення до модулів. Це означає, що нам не потрібно буде додавати тип модуля, а також нам не потрібно буде додавати тип файлу.</p><p>Жоден із цих методів не потребує встановлення пакету чи використання бібліотеки, оскільки вони є вбудованими. Вибирати, який метод використовувати, повністю залежить від вас.</p><p>Але коротка порада, яка відрізняє ці методи, полягає в тому, що Fetch API зчитує файл JSON у JavaScript, надсилаючи запит HTTP, тоді як оператор <code>import</code> не потребує жодного запиту HTTP, а працює як будь-який інший імпорт, який ми виконуємо.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Точкова нотація та дужкова нотація для властивостей об’єкта: яка різниця? ]]>
                </title>
                <description>
                    <![CDATA[ Отримати доступ до властивостей об’єкта у JavaScript можна декількома способами. А ось найпопулярнішими є точкова нотація та дужкова нотація. У цій публікації я розповім різницю між ними. Завдяки точковій та дужковій нотаціям ви можете:  * отримати доступ до значення властивості за ключем  * змінити значення існуючої властивості за ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/tochkova-notatsiya-ta-duzhkova-notatsiya-dlya-vlastyvostey-obyekta-yaka-riznytsya/</link>
                <guid isPermaLink="false">63fb381dd125780651a3b7ec</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Anastasiia Buievych ]]>
                </dc:creator>
                <pubDate>Fri, 03 Mar 2023 05:23:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/19.-dot-vs-bracket-notation.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/dot-notation-vs-square-brackets-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Dot Notation vs Bracket Notation for Object Properties – What's the Difference?</a>
      </p><p>Отримати доступ до властивостей об’єкта у JavaScript можна декількома способами. А ось найпопулярнішими є точкова нотація та дужкова нотація.</p><p>У цій публікації я розповім різницю між ними.</p><p>Завдяки точковій та дужковій нотаціям ви можете:</p><ul><li>отримати доступ до значення властивості за ключем</li><li>змінити значення існуючої властивості за ключем</li><li>додати нову властивість до об’єкта</li></ul><p>Однак ці способи отримують доступ до властивостей по-різному і використовуються у різних ситуаціях.</p><h2 id="-"><strong>Точкова нотація</strong></h2><p>Точкова нотація передбачає використання крапки (<code>.</code>) та ключа, щоб отримати властивість. Ось синтаксис:</p><pre><code class="language-js">об’єкт.ключ</code></pre><p>Після крапки потрібно написати ключ властивості, яку хочемо отримати. Цей вираз поверне значення властивості. Ось приклад:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const target = obj.name
// deeecode
</code></pre><p>Використавши крапку та ключ <strong><strong>name</strong> </strong>(<code>.name</code>), ми отримали «deeecode», що є значенням властивості name.</p><p>Цю нотацію також можна використовувати, щоб змінити існуючу властивість:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

obj.age = 100

console.log(obj)
// {
//   name: "deeecode",
//   age: 100,
//   language: "javascript"
// }
</code></pre><p>Ми змінили властивість <code>age</code>.</p><p>За допомогою такого підходу також можна додати нову властивість:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

obj.location = "Mercury"

console.log(obj)
// {
//   name: "deeecode",
//   age: 80,
//   language: "javascript",
//   location: "Mercury"
// }
</code></pre><p>Ми додали властивість <code>location</code>.</p><p>Але цей підхід має обмеження, які ми незабаром розглянемо. Далі розберемося, як працює дужкова нотація.</p><p>Ось <a href="https://youtu.be/AzVvBO65SMc">відеоверсія</a> цієї теми, якщо вам цікаво.</p><h2 id="--1"><strong>Дужкова нотація</strong></h2><p>Дужкова нотація передбачає використання квадратних дужок, у яких знаходиться вираз, який оцінюється як значення. Це значення служить ключем для доступу до властивості. Ось синтаксис:</p><pre><code class="language-js">об’єкт[вираз]
</code></pre><p>Вираз у дужках оцінюється як ключ властивості, до якої ви хочете отримати доступ, та цей вираз поверне значення властивості. Розглянемо приклад:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const target = obj["name"]
// deeecode
</code></pre><p>Використавши квадратні дужки та вираз <strong><strong>"name"</strong> </strong>(<code>["name"]</code>), ми отримали «deeecode», що є значенням властивості name.</p><p>Цю нотацію також можна використовувати, щоб змінити існуючу властивість:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

obj["age"] = 100

console.log(obj)
// {
//   name: "deeecode",
//   age: 100,
//   language: "javascript"
// }
</code></pre><p>Ми змінили властивість <code>age</code> за допомогою виразу <code>"age"</code>.</p><p>За допомогою квадратних дужок також можна додати нову властивість:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

obj["location"] = "Mercury"

console.log(obj)
// {
//   name: "deeecode",
//   age: 80,
//   language: "javascript",
//   location: "Mercury"
// }
</code></pre><p>Ми додали нову властивість <code>location</code> за допомогою виразу <code>"location"</code>.</p><p>Дужкова нотація має більше можливостей, ніж точкова нотація. Зараз поясню.</p><h2 id="--2"><strong>Різниця між точковою та дужковою нотаціями</strong></h2><p>Точкова нотація дозволяє лише статичні ключі, а дужкова нотація приймає динамічні ключі. Статичний ключ означає, що ключ вводиться напряму, а динамічний ключ означає, що ключ обчислюється у виразі.</p><p>Розглянемо декілька прикладів.</p><h3 id="--3"><strong>Використання обох підходів для доступу до властивостей</strong></h3><p>Починаємо з точкової нотації:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const myKey = "language"

const target = obj.myKey
// undefined
</code></pre><p>Я призначив значення «language» до змінної <code>myKey</code>. Я очікую, що при використанні точкової нотації (тобто <code>obj.myKey</code>) «myKey» зміниться на «language». Тобто це читатиметься як <code>obj.language</code> та поверне «javascript».</p><p>Однак цього не стається, а результатом є <code>undefined</code>.</p><p>Причиною є те, що точкова нотація приймає лише статичні ключі. Тому коли ви використовуєте <code>obj.myKey</code>, JavaScript шукає властивість з ключем <code>myKey</code> у <code>obj</code>. Але такої властивості не існує, тому ми отримуємо <code>undefined</code>.</p><p>А ось дужкова нотація дозволяє динамічні ключі. Оскільки ця нотація приймає вирази, ви можете використати будь-який вираз, який дорівнюватиме значенню. Це може бути:</p><ul><li><code>hello + Hi</code>, що дорівнюватиме <code>helloHi</code> у ролі ключа</li><li><code>returnKey()</code>, що дорівнюватиме значенню у ролі ключа</li><li><code>isTrue ? "trueKey" : "falseKey"</code>, що дорівнюватиме «trueKey» або «falseKey» у ролі ключа</li><li><code>variable</code>, що дорівнюватиме значенню змінної у ролі ключа</li></ul><p>Тому, використовуючи попередній приклад, ми можемо використати наступне:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const myKey = "language"

const target = obj[myKey]
// javascript
</code></pre><p>Переданий у квадратні дужки вираз <code>myKey</code> є змінною. Цей вираз перетвориться на «language», що є значенням змінної. Використовуючи це значення, квадратні дужки можуть отримати значення властивості, тобто «javascript».</p><p>А якщо ви передасте рядок <code>"myKey"</code>, ви отримаєте <code>undefined</code>:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const myKey = "language"

const target = obj["myKey"]
// undefined
</code></pre><p>Причиною є те, що рядок <code>"myKey"</code> оцінюється як значення <code>"myKey"</code>, яке служить як ключ для отримання властивості. Оскільки в <code>obj</code> немає ключа <code>myKey</code>, поверненим значенням є <code>undefined</code>.</p><h3 id="--4"><strong>Використання обох підходів для зміни властивостей</strong></h3><p>Розпочнемо з точкової нотації:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const myKey = "age"

obj.myKey = 100

console.log(obj)
// {
//   name: "deeecode",
//   age: 80,
//   language: "javascript",
//   myKey: 100
// }
</code></pre><p>Ми маємо <code>myKey</code> зі значенням «age». Спроба виконати <code>obj.myKey = 100</code>, щоб змінити властивість <code>age</code>, не спрацює. Причина в тому, що точкова нотація приймає статичний ключ. Тому <code>obj.myKey</code> приймає <code>myKey</code> як ключ. Оскільки в <code>obj</code> не існує <code>mykey</code>, інструкція додає ключ. Отже, <code>obj</code> має новий ключ <code>myKey</code> зі значенням <code>100</code>.</p><p>Якщо використати дужкову нотацію, поведінка інша:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const myKey = "age"

obj[myKey] = 100

console.log(obj)
// {
//   name: "deeecode",
//   age: 100,
//   language: "javascript"
// }
</code></pre><p>Замість того, щоб додавати нову властивість <code>myKey</code> до <code>obj</code>, дужкова нотація змінює властивість <code>age</code>. Причина в тому, що ми передаємо <code>myKey</code> як вираз до квадратних дужок. Цей вираз у ролі змінної перетворюється на <code>"age"</code>, що є значенням змінної. &nbsp;Використовуючи «age» у ролі ключа, цей підхід змінює значення властивості <code>age</code> на <code>100</code>.</p><p>А якщо нам потрібно додати нову властивість за допомогою квадратних дужок, ми передаємо вираз, що повертає новий ключ, який не існує. Наприклад:</p><pre><code class="language-js">const obj = {
  name: "deeecode",
  age: 80,
  language: "javascript",
}

const myKey = "location"

obj[myKey] = "Mercury"

console.log(obj)
// {
//   name: "deeecode",
//   age: 100,
//   language: "javascript",
//   location: "Mercury"
// }
</code></pre><p>Змінна <code>myKey</code> отримує нове значення <code>"location"</code>. Передавши його до квадратних дужок та призначивши значення «Mercury», ми отримаємо нову властивість з парою ключ-значення: <code>location</code> та «Mercury».</p><h2 id="--5"><strong>Яку нотацію використовувати?</strong></h2><p>Ми розглянули кожну нотацію, використавши різні приклади для доступу/зміни існуючих властивостей та додавання нових властивостей. Отож, яку нотацію використовувати при написанні коду JavaScript?</p><p>Головним фактором, який допоможе прийняти рішення, є ключ властивості, до якої ви хочете отримати доступ. Якщо це статичний ключ, використовуйте точкову нотацію. А якщо це динамічний ключ (обчислюється у виразі під час виконання), використовуйте дужкову нотацію.</p><p>Точкова нотація корисна, якщо ви знаєте властивість заздалегідь. Ви просто використовуєте <code>object.key</code>, щоб прочитати/змінити існуючу властивість чи додати нову властивість. </p><p>Дужкова нотація корисна, якщо ви хочете <a href="https://www.freecodecamp.org/news/how-to-set-dynamic-object-properties-using-computed-property-names/">динамічно отримати доступ до властивості</a>. Ключ такої властивості може походити від виразів типу <code>getKey()</code>, <code>"my" + "key"</code> чи <code>keyVariable</code>.</p><p>Сподіваюсь, ви щось вивчили. Будь ласка, поділіться публікацією, якщо вона була корисною :)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Найпопулярніші способи зробити запит HTTP у JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ У JavaScript є чудові модулі та методи для створення запитів HTTP, які можна використовувати для надсилання чи отримання даних зі сторони сервера. У цій публікації ми розглянемо кілька популярних способів створення запитів HTTP у JavaScript. Ajax Ajax — це традиційний спосіб створення асинхронного запиту HTTP. Дані можна надсилати за допомогою ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/naypopulyarnishi-sposoby-zrobyty-zapyt-http-u-javascript/</link>
                <guid isPermaLink="false">63eb4b900a9291056ed3dbad</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Sat, 18 Feb 2023 14:27:40 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/1-gqHgCNubMncv7EwWNdArGQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/here-is-the-most-popular-ways-to-make-an-http-request-in-javascript-954ce8c95aaa/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Here are the most popular ways to make an HTTP request in JavaScript</a>
      </p><p>У JavaScript є чудові модулі та методи для створення запитів HTTP, які можна використовувати для надсилання чи отримання даних зі сторони сервера. У цій публікації ми розглянемо кілька популярних способів створення запитів HTTP у JavaScript.</p><h3 id="ajax"><strong><strong>Ajax</strong></strong></h3><p>Ajax — це традиційний спосіб створення асинхронного запиту HTTP. Дані можна надсилати за допомогою методу HTTP POST і отримувати за допомогою методу HTTP GET. Давайте подивимось, як зробити запит <code>GET</code>. Я буду використовувати сайт JSONPlaceholder — безкоштовний онлайн API REST для розробників, який повертає випадкові дані у форматі JSON.</p><p>Щоб зробити виклик HTTP в Ajax, потрібно ініціалізувати новий метод <code>XMLHttpRequest()</code> та вказати кінцеву точку URL-адреси і метод HTTP (у цьому випадку GET). Далі ми використовуємо метод <code>open()</code> для зв’язування методу HTTP та кінцевої точки URL-адреси і викликаємо метод <code>send()</code> для ініціалізації запиту.</p><p>Ми реєструємо відповідь HTTP в консолі за допомогою властивості <code>XMLHTTPRequest.onreadystatechange</code>, яка містить обробник подій, що викликається, коли подія <code>readystatechanged</code> запускається.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*zXtlRe4yRF3tZkFFvBhZeA.png" class="kg-image" alt="1*zXtlRe4yRF3tZkFFvBhZeA" width="800" height="349" loading="lazy"></figure><pre><code class="language-js">const Http = new XMLHttpRequest();
const url='https://jsonplaceholder.typicode.com/posts';
Http.open("GET", url);
Http.send();

Http.onreadystatechange = (e) =&gt; {
  console.log(Http.responseText)
}</code></pre><p>Якщо ви переглянете консоль браузера, то побачите, що вона поверне масив даних у форматі JSON. Але як ми можемо знати, чи запит виконано? Іншими словами, як ми можемо обробляти відповіді за допомогою Ajax?</p><p>Властивість <code>onreadystatechange</code> має два методи: <code>readyState</code> та <code>status</code>, які дозволяють перевірити стан нашого запиту.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*UfZf6qaZwNh5Mptft4WIZA.png" class="kg-image" alt="1*UfZf6qaZwNh5Mptft4WIZA" width="800" height="376" loading="lazy"></figure><p>Якщо <code>readyState</code> дорівнює 4, то це свідчить про те, що запит виконано. Властивість <code>readyState</code> має 5 відповідей. Дізнайтесь про них більше за цим <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState">посиланням</a>.</p><p>Окрім прямого виклику Ajax за допомогою JavaScript існують й інші, більш потужні методи здійснення виклику HTTP (наприклад, <code>$.Ajax</code>, який є методом jQuery) і тому я зупинюсь на них більш детально.</p><h3 id="-jquery"><strong>Методи <strong>jQuery</strong></strong></h3><p>jQuery має багато методів для легкої обробки запитів HTTP. Щоб використати ці методи, вам потрібно включити бібліотеку jQuery до свого проєкту.</p><pre><code class="language-html">&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;</code></pre><h4 id="-ajax"><strong><strong>$.ajax</strong></strong></h4><p>jQuery Ajax є одним із найпростіших методів здійснення виклику HTTP.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*vZ4BqVQfsvtpJm_RCsCE2Q.png" class="kg-image" alt="1*vZ4BqVQfsvtpJm_RCsCE2Q" width="800" height="429" loading="lazy"></figure><p>Метод <code>$.ajax</code> приймає багато параметрів, деякі з яких є обов’язковими, а інші необов’язковими. Він містить два варіанти функції зворотного виклику: <code>success</code> та <code>error</code>, щоб обробити отриману відповідь.</p><h4 id="-get"><strong>Метод <strong>$.get</strong></strong></h4><p>Метод <code>$.get</code> використовується для виконання запитів GET. Він приймає два параметри: кінцеву точку та функцію зворотного виклику.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*2koN5FJuT68WIyRKTihe5w.png" class="kg-image" alt="1*2koN5FJuT68WIyRKTihe5w" width="797" height="287" loading="lazy"></figure><h4 id="-post"><strong>Метод <strong>$.post</strong></strong></h4><p>Метод <code>$.post</code> — це інший спосіб надсилання даних на сервер. Він приймає три параметри: <code>url</code>, дані, які ви хочете надіслати, і функцію зворотного виклику.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*ql6Yp1EJfD7850GXhErwyw.png" class="kg-image" alt="1*ql6Yp1EJfD7850GXhErwyw" width="695" height="355" loading="lazy"></figure><h4 id="-getjson"><strong><strong>$.getJSON</strong></strong></h4><p>Метод <code>$.getJSON</code> отримує дані лише у форматі JSON. Він приймає два параметри: <code>url</code> та функцію зворотного виклику.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*hdcFdVHiBiRAo1YOi_Kt0Q.png" class="kg-image" alt="1*hdcFdVHiBiRAo1YOi_Kt0Q" width="755" height="291" loading="lazy"></figure><p>jQuery має ці методи для запиту або надсилання даних на віддалений сервер. Але насправді їх можна поєднати в один метод <code>$.ajax</code>, як показано у прикладі нижче:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*soPARjfQXMcZ5ccPK1QMmA.png" class="kg-image" alt="1*soPARjfQXMcZ5ccPK1QMmA" width="800" height="420" loading="lazy"></figure><h3 id="-fetch"><strong>Функція <strong>fetch</strong></strong></h3><p>Функція <code>fetch</code> — це новий потужний web API, який дозволяє робити асинхронні запити. Насправді, <code>fetch</code> є одним із найкращих і моїх улюблених способів зробити запит HTTP. Він повертає проміс, що є однією з чудових функцій ES6. Якщо ви не знайомі з ES6, ви можете прочитати про нього в <a href="https://www.freecodecamp.org/news/write-less-do-more-with-javascript-es6-5fd4a8e50ee2">цій</a> публікації. Проміси дозволяють нам розумніше обробляти асинхронний запит. Давайте подивимося, як працює <code>fetch</code>.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*kz6k4VRs0RiVCasWR0pCow.png" class="kg-image" alt="1*kz6k4VRs0RiVCasWR0pCow" width="800" height="270" loading="lazy"></figure><p>Функція <code>fetch</code> приймає один обов’язковий параметр: URL <code>endpoint</code>. Також вона може мати інші додаткові параметри, як у прикладі нижче:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*QasrBgYZcU4BBFHqD2bBdg.png" class="kg-image" alt="1*QasrBgYZcU4BBFHqD2bBdg" width="800" height="497" loading="lazy"></figure><p>Як ви можете бачити, <code>fetch</code> має багато переваг для виконання запитів HTTP. Ви можете дізнатися більше про них <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch">тут</a>. Крім того, у fetch є інші модулі та плагіни, які дозволяють надсилати запити на сервер та отримувати їх зі сторони сервера (наприклад, <a href="https://github.com/axios/axios">axios</a>).</p><h3 id="axios"><strong><strong>Axios</strong></strong></h3><p>Axios — це бібліотека з відкритим вихідним кодом для створення запитів HTTP, яка надає багато чудових функцій. Давайте подивимося, як вона працює.</p><h4 id="-"><strong>Використання:</strong></h4><p>По-перше, вам потрібно включити Axios. Існує два способи включити Axios до проєкту.</p><p>Перший: ви можете використати npm:</p><pre><code class="language-bash">npm install axios --save</code></pre><p>І потім вам потрібно імпортувати його:</p><pre><code class="language-js">import axios from 'axios'</code></pre><p>Другий: ви можете включити axios за допомогою CDN:</p><pre><code class="language-html">&lt;script src="https://unpkg.com/axios/dist/axios.min.js"&gt;&lt;/script&gt;</code></pre><h4 id="-axios-">Створення запиту з <strong><strong>axios:</strong></strong></h4><p>З Axios ви можете використати <code>GET</code> та <code>POST</code> для отримання та надсилання даних із сервера.</p><h4 id="get-"><strong><strong>GET:</strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*4wmqiPsSN5mdgjJiRaKVZg.png" class="kg-image" alt="1*4wmqiPsSN5mdgjJiRaKVZg" width="781" height="440" loading="lazy"></figure><p><code>axios</code> приймає один обов’язковий параметр і може приймати другий необов’язковий параметр. Деякі дані сприймаються як простий запит.</p><h4 id="post-"><strong><strong>POST:</strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*ey6-vwsrm9RAhyoU15u6xQ.png" class="kg-image" alt="1*ey6-vwsrm9RAhyoU15u6xQ" width="755" height="412" loading="lazy"></figure><p>Axios повертає проміс. Якщо ви знайомі з промісами, ви, мабуть, знаєте, що проміси можуть виконувати кілька запитів. Ви можете робити те саме з axios і виконувати кілька запитів одночасно.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*40Pji4utVKPpC7-dePfC6Q.png" class="kg-image" alt="1*40Pji4utVKPpC7-dePfC6Q" width="800" height="396" loading="lazy"></figure><p>Axios підтримує багато інших методів і опцій. Ви можете дослідити їх <a href="https://github.com/axios/axios">тут</a>.</p><h3 id="angular-httpclient"><strong><strong>Angular HttpClient</strong></strong></h3><p>У Angular є власний модуль HTTP, який працює з додатками Angular. Він використовує бібліотеку <a href="https://rxjs-dev.firebaseapp.com/">RxJS</a> для обробки асинхронних запитів і надає багато варіантів для виконання запитів HTTP.</p><h4 id="-angular-httpclient"><strong>Здійснення запиту на сервер за допомогою Angular HttpClient</strong></h4><p>Щоб зробити запит за допомогою Angular HttpClient, потрібно запустити наш код у додатку Angular. Тому я створив його. Якщо ви не знайомі з Angular, перегляньте мою публікацію, щоб дізнатися, як створити свій перший <a href="https://www.freecodecamp.org/news/learn-how-to-create-your-first-angular-app-in-20-min-146201d9b5a7">додаток Angular за 20 хвилин</a>.</p><p>Перше, що нам потрібно зробити — імпортувати <code>HttpClientModule</code> до <code>app.module.ts</code></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*iFuW5Fbp91VR5gwQ6XNMEQ.png" class="kg-image" alt="1*iFuW5Fbp91VR5gwQ6XNMEQ" width="758" height="632" loading="lazy"></figure><p>Потім ми повинні створити сервіс для обробки запитів. Ви можете легко створити сервіс за допомогою <a href="https://angular.io/cli">Angular CLI</a>:</p><pre><code class="language-bash">ng g service  FetchdataService</code></pre><p>Далі нам потрібно імпортувати HttpClient до сервісу <code>fetchdataService.ts</code> і вставити його всередині конструктора:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*kKwELAhSSpnN8DvIgdOfcQ.png" class="kg-image" alt="1*kKwELAhSSpnN8DvIgdOfcQ" width="685" height="461" loading="lazy"></figure><p>А в <code>app.component.ts</code> імпортувати <code>fetchdataService</code> :</p><pre><code class="language-ts">//import
import { FetchdataService } from './fetchdata.service';</code></pre><p>Зрештою, потрібно викликати сервіс і запустити його.</p><p><code>app.component.ts:</code></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*OrRe183Yaclt19n5ZQ194Q.png" class="kg-image" alt="1*OrRe183Yaclt19n5ZQ194Q" width="788" height="620" loading="lazy"></figure><p>Ви можете переглянути приклад <a href="https://stackblitz.com/edit/angular-httpclinent" rel="noopener">на Stackblitz</a>.</p><h3 id="--1"><strong>Підсумки</strong></h3><p>Ми щойно розглянули найпопулярніші способи зробити запити HTTP у JavaScript.</p><p>Дякую за ваш час. Якщо вам сподобалась публікація, очікую оплесків та підписників у <a href="https://twitter.com/SaidHYN" rel="noopener">твіттері</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Debounce: як затримати виклик функції в JavaScript (приклад JS ES6) ]]>
                </title>
                <description>
                    <![CDATA[ У JavaScript функція debounce гарантує, що ваш код запускається лише один раз за введення користувача. Пропозиції у вікні пошуку, автоматичне збереження текстових полів і усунення подвійних натискань кнопок — усе це випадки використання функції debounce.  У цьому посібнику ми дізнаємося, як створити функцію debounce в JavaScript. Що таке debounce? ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/debounce-yak-zatrymaty-vyklyk-funktsiyi-v-javascript-pryklad-js-es6/</link>
                <guid isPermaLink="false">63e27dcbf1df0805b225033c</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Tue, 07 Feb 2023 17:41:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/teaser.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/javascript-debounce-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Debounce – How to Delay a Function in JavaScript (JS ES6 Example)</a>
      </p><p>У JavaScript функція debounce гарантує, що ваш код запускається лише один раз за введення користувача. Пропозиції у вікні пошуку, автоматичне збереження текстових полів і усунення подвійних натискань кнопок — усе це випадки використання функції debounce. </p><p>У цьому посібнику ми дізнаємося, як створити функцію debounce в JavaScript.</p><h2 id="-debounce"><strong>Що таке debounce?</strong></h2><p>Термін <strong>debounce </strong>походить від електроніки. Коли ви натискаєте кнопку, скажімо, на пульті дистанційного керування телевізором, то сигнал надходить до мікрочіпа пульта настільки швидко, що перш ніж ви встигнете відпустити кнопку, він неодноразово повторюється і мікрочіп реєструє ваше «клацання» декілька разів.<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/01/debounce-button.png" class="kg-image" alt="debounce-button" width="600" height="400" loading="lazy"></figure><p>Щоб змінити це, після отримання сигналу від кнопки мікрочіп припиняє обробку сигналів від неї на кілька мікросекунд — на той час, коли ви фізично не в змозі натиснути її знову.</p><h2 id="debounce-javascript"><strong>Debounce у JavaScript</strong></h2><p>У JavaScript сценарій використання схожий. Ми хочемо запустити функцію, але лише один раз для кожного випадку використання.</p><p>Скажімо, ми хочемо показати пропозиції для пошукового запиту, але лише після того, як відвідувач завершить його введення.</p><p>Або ми хочемо зберегти зміни у формі, але лише тоді, коли користувач не працює активно над цими змінами, оскільки кожне «збереження» коштує нам подорожі до бази даних.</p><p>І мій улюблений приклад: деякі люди так звикли до Windows 95, що й досі двічі клацають усе 😁.</p><p>Це проста реалізація функції debounce:</p><pre><code class="language-js">function debounce(func, timeout = 300){
  let timer;
  return (...args) =&gt; {
    clearTimeout(timer);
    timer = setTimeout(() =&gt; { func.apply(this, args); }, timeout);
  };
}
function saveInput(){
  console.log('Saving data');
}
const processChange = debounce(() =&gt; saveInput());
</code></pre><p>Її можна використовувати для введення:</p><pre><code class="language-html">&lt;input type="text" onkeyup="processChange()" /&gt;
</code></pre><p>Або для кнопки:</p><pre><code class="language-html">&lt;button onclick="processChange()"&gt;Click me&lt;/button&gt;
</code></pre><p>Або для події у вікні:</p><pre><code class="language-js">window.addEventListener("scroll", processChange);
</code></pre><p>І для інших елементів (наприклад, простих функцій JS).</p><p>Отже, що тут відбувається? <code>debounce</code> — це спеціальна функція, яка виконує два завдання:</p><ul><li>виділення області для змінної <em><em>timer</em></em></li><li>планування запуску функції в певний час</li></ul><p>Давайте пояснимо, як це працює в першому випадку використання з введенням тексту.</p><p>Коли відвідувач пише першу літеру та відпускає кнопку, то <code>debounce</code> спочатку скидає таймер за допомогою <code>clearTimeout(timer)</code>. На даний момент крок непотрібний, оскільки ще нічого не заплановано. Потім вона планує виклик наданої функції <code>saveInput()</code>, яка буде викликана через 300 мс.</p><p>Але, припустімо, що відвідувач продовжує писати, тому кожне відпускання кнопки знову викликає функцію <code>debounce</code>. Кожен виклик потребує скидання таймера, або, іншими словами, скасування попередніх планів <code>saveInput()</code>, і перепланування на новий час — 300 мс у майбутньому. Це триває до тих пір, поки відвідувач продовжує натискати кнопки.</p><p>Останнє планування виклику наданої функції <code>saveInput()</code> не буде очищено, і тому її зрештою буде викликано.</p><h2 id="-"><strong>І навпаки: як ігнорувати подальші виклики</strong></h2><p>Це все добре для запуску автозбереження або відображення пропозицій. Але як щодо випадку використання з кількома натисканнями однієї кнопки? Ми не хочемо чекати останнього натиску, а краще зареєструвати перший і ігнорувати решту:</p><pre><code class="language-js">function debounce_leading(func, timeout = 300){
  let timer;
  return (...args) =&gt; {
    if (!timer) {
      func.apply(this, args);
    }
    clearTimeout(timer);
    timer = setTimeout(() =&gt; {
      timer = undefined;
    }, timeout);
  };
}
</code></pre><p>Тут ми запускаємо функцію <code>saveInput()</code> під час першого виклику функції <code>debounce_leading</code>, яка у свою чергу ініціалізується першим натисканням кнопки. Плануємо знищення таймера на 300 мс. Кожне наступне натискання кнопки протягом цього періоду часу вже матиме визначений таймер і зсуватиме деструкцію лише на 300 мс у майбутнє.</p><h2 id="-debounce-"><strong>Реалізації debounce в бібліотеках</strong></h2><p>У цій статті я показав вам, як реалізувати функцію debounce у JavaScript і використовувати її для, ну, debounce подій, викликаних елементами вебсайту. </p><p>Однак вам не потрібно використовувати власну реалізацію debounce у своїх проєктах, якщо ви цього не хочете. Широко використовувані бібліотеки JS вже містять її реалізацію:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-style: normal; font-variant-caps: normal; font-weight: 400; font-stretch: inherit; line-height: inherit; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background-image: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%), radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%); background-origin: initial, initial; background-clip: initial, initial; background-attachment: scroll, scroll; background-size: 10px 100%, 10px 100%; caret-color: rgb(10, 10, 35); color: rgb(10, 10, 35); letter-spacing: normal; orphans: auto; text-align: start; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; background-position: 0px center, 100% center; background-repeat: no-repeat no-repeat;"><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: italic; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">Library</strong></em></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: italic; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">Example</strong></em></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><a href="http://benalman.com/projects/jquery-throttle-debounce-plugin/" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">jQuery (via library)</a></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-family: &quot;Roboto Mono&quot;, monospace; font-style: inherit; font-variant-caps: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">$.debounce(300, saveInput);</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><a href="https://lodash.com/docs/4.17.15#debounce" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Lodash</a></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-family: &quot;Roboto Mono&quot;, monospace; font-style: inherit; font-variant-caps: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">_.debounce(saveInput, 300);</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><a href="https://underscorejs.org/#debounce" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Underscore</a></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-family: &quot;Roboto Mono&quot;, monospace; font-style: inherit; font-variant-caps: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">_.debounce(saveInput, 300);</code></td></tr></tbody></table><!--kg-card-end: html--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Посібник з масиву об’єктів JavaScript: як створювати, оновлювати та переглядати об’єкти за допомогою методів масиву JS ]]>
                </title>
                <description>
                    <![CDATA[ В середньому я працюю з даними JSON 18 разів на тиждень. І мені досі потрібно майже кожного разу гуглити конкретні способи маніпулювання ними. Лише уявіть, якби був путівник з усіма відповідями. У цій публікації я покажу основи роботи з масивами об’єктів у JavaScript. Якщо ви коли-небудь працювали зі структурою JSON, ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/posibnyk-z-masyvu-ob-yektiv-javascript-yak-stvoryuvaty-onovlyuvaty-ta-perehlyadaty-ob-yekty-za-dopomohoyu-metodiv-masyvu-js/</link>
                <guid isPermaLink="false">63dd39ca3eba3806ff37e37f</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Fri, 03 Feb 2023 17:35:39 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/js-tutorial-cover-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/javascript-array-of-objects-tutorial-how-to-create-update-and-loop-through-objects-using-js-array-methods/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Array of Objects Tutorial – How to Create, Update, and Loop Through Objects Using JS Array Methods</a>
      </p><p>В середньому я працюю з даними JSON 18 разів на тиждень. І мені досі потрібно майже кожного разу гуглити конкретні способи маніпулювання ними. Лише уявіть, якби був путівник з усіма відповідями.</p><p>У цій публікації я покажу основи роботи з масивами об’єктів у JavaScript.</p><p>Якщо ви коли-небудь працювали зі структурою JSON, ви працювали з об’єктами JavaScript. Буквально. JSON розшифровується як JavaScript Object Notation. </p><p>Створити об’єкт JSON так само просто:</p><pre><code class="language-js">{
  "color": "purple",
  "type": "minivan",
  "registration": new Date('2012-02-03'),
  "capacity": 7
}
</code></pre><p>Цей об’єкт представляє автомобіль. Може бути безліч різних кольорів чи типів автомобілів, але кожен об’єкт являє собою окрему машину.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/purple.png" class="kg-image" alt="purple" width="600" height="400" loading="lazy"></figure><p>Зараз такі дані найчастіше отримують зовні. Але іноді потрібно створити об’єкти та їх масиви вручну, як я робив, коли створював цей інтернет-магазин:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/categories.jpg" class="kg-image" alt="categories" width="600" height="400" loading="lazy"></figure><p>Розглядаючи кожну категорію, елемент списку у HTML виглядає так:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/code.jpg" class="kg-image" alt="code" width="600" height="400" loading="lazy"></figure><p>Я би не хотів, щоб цей код повторювався 12 разів, оскільки в подальшому він може стати непідтримуваним. </p><h2 id="-"><strong>Створення масиву об’єктів</strong></h2><p>Але повернемося до автомобілів. Давайте подивимося на цей набір:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars.jpg" class="kg-image" alt="cars" width="600" height="400" loading="lazy"></figure><p>Ми можемо представити його у вигляді масиву таким чином:</p><pre><code class="language-js">let cars = [
  {
    "color": "purple",
    "type": "minivan",
    "registration": new Date('2017-01-03'),
    "capacity": 7
  },
  {
    "color": "red",
    "type": "station wagon",
    "registration": new Date('2018-03-03'),
    "capacity": 5
  },
  {
    ...
  },
  ...
]
</code></pre><p>Масиви об’єктів не залишаються такими самими весь час. Нам майже завжди потрібно ними маніпулювати. Отже, давайте розглянемо, як ми можемо додавати об’єкти до вже існуючого масиву.</p><h3 id="-array-unshift"><strong>Додавання нового об’єкту до початку масиву — Array.unshift</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/beginning.jpg" class="kg-image" alt="beginning" width="600" height="400" loading="lazy"></figure><p>Щоб додати об’єкт на першу позицію, використовуйте <code>Array.unshift</code>.</p><h3 id="-array-push"><strong>Додавання нового об’єкту в кінець масиву — Array.push</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/ending.jpg" class="kg-image" alt="ending" width="600" height="400" loading="lazy"></figure><p>Щоб додати об’єкт в кінець масиву, використовуйте <code>Array.push</code>.</p><pre><code class="language-js">let car = {
 "color": "red",
 "type": "cabrio",
 "registration": new Date('2016-05-02'),
 "capacity": 2
}
cars.push(car);
</code></pre><h3 id="-array-splice"><strong>Додавання нового об’єкту посеред масиву — Array.splice</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/middle.jpg" class="kg-image" alt="middle" width="600" height="400" loading="lazy"></figure><p>Щоб додати об’єкт посередині, використовуйте<code>Array.splice</code>. Ця функція дуже зручна, оскільки вона також може видаляти елементи. Зверніть увагу на її параметри:</p><pre><code class="language-js">Array.splice(
  {index where to start},
  {how many items to remove},
  {items to add}
);
</code></pre><p>Отже, якщо ми хочемо додати червоний Volkswagen Cabrio на п’яте місце, ми використаємо:</p><pre><code class="language-js">let car = {
  "color": "red",
  "type": "cabrio",
  "registration": new Date('2016-05-02'),
  "capacity": 2
}
cars.splice(4, 0, car);
</code></pre><h2 id="--1"><strong>Перегляд масиву об’єктів</strong></h2><p>Дозвольте мені поставити вам запитання: для чого вам переглядати масив об’єктів? Причина, чому я запитую, полягає в тому, що зациклення майже ніколи не є основною причиною того, чого ми хочемо досягти.</p><p>JavaScript надає багато функцій, які можуть вирішити вашу проблему без реалізації логіки в загальному циклі. Давайте поглянемо.</p><h3 id="-array-find"><strong>Пошук об’єкта в масиві за його значеннями — Array.find</strong></h3><p>Припустимо, ми хочемо знайти автомобіль червоного кольору. Ми можемо використати функцію <code>Array.find</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-colorred.jpg" class="kg-image" alt="cars-colorred" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let car = cars.find(car =&gt; car.color === "red");
</code></pre><p>Ця функція повертає перший елемент, який відповідає значенню:</p><pre><code class="language-js">console.log(car);
// output:
// {
//   color: 'red',
//   type: 'station wagon',
//   registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//   capacity: 5
// }
</code></pre><p>Також можна шукати за кількома значеннями:</p><p><code>let car = cars.find(car =&gt; car.color === "red" &amp;&amp; car.type === "cabrio");</code></p><p>У цьому випадку ми отримаємо останню машину в списку.</p><h3 id="-array-filter"><strong>Отримання кількох елементів із масиву, які відповідають умові — Array.filter</strong></h3><p>Функція &nbsp;<code>Array.find</code> повертає лише один об’єкт. Якщо ми хочемо отримати всі червоні машини, нам потрібно використовувати <code>Array.filter</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-colorred2.jpg" class="kg-image" alt="cars-colorred2" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let redCars = cars.filter(car =&gt; car.color === "red");
console.log(redCars);
// output:
// [
//   {
//     color: 'red',
//     type: 'station wagon',
//     registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 5
//   },
//   {
//     color: 'red',
//     type: 'cabrio',
//     registration: 'Sat Mar 03 2012 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 2
//   }
// ]
</code></pre><h3 id="-array-map"><strong>Перетворення об’єктів масиву — Array.map</strong></h3><p>Це те, що нам дуже часто потрібно. Перетворення масиву об’єктів на масив інших об’єктів. Це робота для <code>Array.map</code>. Скажімо, ми хочемо класифікувати наші автомобілі на три групи залежно від їхнього розміру.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-sizes.jpg" class="kg-image" alt="cars-sizes" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let sizes = cars.map(car =&gt; {
  if (car.capacity &lt;= 3){
    return "small";
  }
  if (car.capacity &lt;= 5){
    return "medium";
  }
  return "large";
});
console.log(sizes);
// output:
// ['large','medium','medium', ..., 'small']
</code></pre><p>Також можна створити новий об’єкт, якщо нам потрібно більше значень:</p><pre><code class="language-js">let carsProperties = cars.map(car =&gt; {
 let properties = {
   "capacity": car.capacity,
   "size": "large"
 };
 if (car.capacity &lt;= 5){
   properties['size'] = "medium";
 }
 if (car.capacity &lt;= 3){
   properties['size'] = "small";
 }
 return properties;
});
console.log(carsProperties);
// output:
// [
//   { capacity: 7, size: 'large' },
//   { capacity: 5, size: 'medium' },
//   { capacity: 5, size: 'medium' },
//   { capacity: 2, size: 'small' },
//   ...
// ]
</code></pre><h3 id="-array-foreach"><strong>Додавання властивості до кожного об’єкту масиву — Array.forEach</strong></h3><p>А якщо нам також потрібен розмір автомобіля? У цьому випадку ми можемо використати в об’єкті властивість &nbsp;<code>size</code>. Це хороший варіант використання для функції <code>Array.forEach</code>.</p><pre><code class="language-js">cars.forEach(car =&gt; {
 car['size'] = "large";
 if (car.capacity &lt;= 5){
   car['size'] = "medium";
 }
 if (car.capacity &lt;= 3){
   car['size'] = "small";
 }
});</code></pre><h3 id="-array-sort"><strong>Сортування масиву за властивістю — Array.sort</strong></h3><p>Коли ми закінчили з перетворенням об’єктів, нам зазвичай потрібно відсортувати їх тим чи іншим способом.</p><p>Як правило, сортування базується на значенні властивості кожного об’єкта. Ми можемо використовувати функцію <code>Array.sort</code> , але нам також потрібно надати іншу функцію, яка визначає механізм сортування.</p><p>Скажімо, ми хочемо відсортувати автомобілі за їхньою містивністю в порядку спадання.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-sort.jpg" class="kg-image" alt="cars-sort" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let sortedCars = cars.sort((c1, c2) =&gt; (c1.capacity &lt; c2.capacity) ? 1 : (c1.capacity &gt; c2.capacity) ? -1 : 0);
console.log(sortedCars);
// output:
// [
//   {
//     color: 'purple',
//     type: 'minivan',
//     registration: 'Wed Feb 01 2017 00:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 7
//   },
//   {
//     color: 'red',
//     type: 'station wagon',
//     registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 5
//   },
//   ...
// ]
</code></pre><p>Функція <code>Array.sort</code> порівнює два об’єкти і ставить перший об’єкт на друге місце, якщо результат функції сортування позитивний. Таким чином, ви можете дивитися на функцію сортування так, ніби це було питання: чи варто розмістити перший об’єкт на другому місці?</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/sort.png" class="kg-image" alt="sort" width="600" height="400" loading="lazy"></figure><p>Обов’язково враховуйте випадок для нуля, коли порівнювані значення обох об’єктів однакові, щоб уникнути непотрібних замін.</p><h3 id="-array-every-array-includes"><strong>Перевірка відповідності умови об’єктів у масиві — Array.every, Array.includes</strong></h3><p><code>Array.every</code> та <code>Array.some</code> стають в нагоді, коли нам просто потрібно перевірити кожен об’єкт на певну умову.</p><p>Чи є у нас червоний кабріолет у списку машин? Чи всі автомобілі здатні перевозити щонайменше 4 людини? Або випадок, більш орієнтований на інтернет: чи є певний продукт у кошику?</p><pre><code class="language-js">cars.some(car =&gt; car.color === "red" &amp;&amp; car.type === "cabrio");
// output: true

cars.every(car =&gt; car.capacity &gt;= 4);
// output: false
</code></pre><p>Ви можете пам’ятати функцію <code>Array.includes</code>, яка схожа до <code>Array.some</code>, <br>але працює лише для примітивних типів.</p><h2 id="--2"><strong>Підсумок</strong></h2><p>У цій статті ми ознайомилися з основними функціями, які допомагають створювати, маніпулювати, перетворювати та переглядати масиви об’єктів. Вони мають охоплювати більшість випадків, на які ви натрапите.</p><p>Якщо у вас є потреба у більш розширеній функціональності, перегляньте <a href="https://www.freecodecamp.org/news/data-structures-101-arrays-a-visual-introduction-for-beginners-7f013bcc355a/">цей детальний посібник із масивів</a> або відвідайте <a href="https://www.w3schools.com/Jsref/jsref_obj_array.asp">W3Schools</a>.</p><p>Або <a href="https://twitter.com/ondrabus">зв’яжіться зі мною</a>, і я підготую іншу публікацію :-)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Приклад JSON stringify: як парсити об’єкт JSON за допомогою JS ]]>
                </title>
                <description>
                    <![CDATA[ JSON, або JavaScript Object Notation (укр. запис об’єктів JavaScript), оточує нас всюди. Якщо ви коли-небудь користувалися вебзастосунком, є велика ймовірність, що він використовував JSON для структурування, зберігання та передачі даних між своїми серверами та вашим пристроєм. У цій публікації ми коротко розглянемо відмінності між JSON та JavaScript, а потім перейдемо ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/pryklad-json-stringify-yak-parsyty-ob-yekt-json-za-dopomohoyu-js/</link>
                <guid isPermaLink="false">63ba9c12a65c1b06d972e684</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ rustamdocstranslator ]]>
                </dc:creator>
                <pubDate>Sun, 08 Jan 2023 17:33:56 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/01/602358380a2838549dcc2554.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/json-stringify-example-how-to-parse-a-json-object-with-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JSON Stringify Example – How to Parse a JSON Object with JS</a>
      </p><p>JSON, або JavaScript Object Notation (укр. <em>запис об’єктів JavaScript)</em>, оточує нас всюди. Якщо ви коли-небудь користувалися вебзастосунком, є велика ймовірність, що він використовував JSON для структурування, зберігання та передачі даних між своїми серверами та вашим пристроєм.</p><p>У цій публікації ми коротко розглянемо відмінності між JSON та JavaScript, а потім перейдемо до різних способів парсингу JSON за допомогою JavaScript у браузері та проєктах Node.js.</p><h2 id="-json-javascript">Відмінності між JSON та JavaScript</h2><p>Хоча JSON і виглядає як звичайний JavaScript, його краще вважати форматом даних, подібним до текстового файлу. Так сталося, що JSON надихається синтаксисом JavaScript, тому вони схожі.</p><p>Розглянемо об’єкти JSON і масиви JSON та порівняємо їх з відповідниками JavaScript.</p><h3 id="-json-vs-javascript">Об’єкти JSON vs літерали об’єктів JavaScript</h3><p>По-перше, ось об’єкт JSON:</p><figure class="kg-card kg-code-card"><pre><code class="language-json">{
  "name": "Jane Doe",
  "favorite-game": "Stardew Valley",
  "subscriber": false
}
</code></pre><figcaption>jane-profile.json</figcaption></figure><p>Основна відмінність між об’єктом JSON та звичайним об’єктом JavaScript, який також називають літералом об’єкта, полягає у лапках. Всі ключі та значення рядків в об’єкті JSON повинні бути в лапках (<code>"</code>).</p><p>Літерали об’єктів JavaScript трохи гнучкіші. В об’єктних літералах вам не потрібно брати ключі та рядки в лапки. Замість цього ви можете використати одинарні лапки (<code>'</code>) або взагалі не використовувати лапки для ключів.</p><p>Наведений вище код міг би виглядати ось так, якби був літералом об’єкта JavaScript:</p><pre><code class="language-js">const profile = {
  name: 'Jane Doe',
  'favorite-game': 'Stardew Valley',
  subscriber: false
}
</code></pre><p>Зверніть увагу, що ключ <code>'favorite-game'</code> в одинарних лапках. Для об’єктних літералів потрібно брати в лапки ключі, де слова розділені тире (<code>-</code>).</p><p>Якщо ви хочете уникнути лапок, ви можете переписати ключ, використавши верблюдячий регістр (<code>favoriteGame</code>) або розділивши слова підкресленням (<code>favorite_game</code>).</p><h3 id="-json-vs-javascript-1">Масиви JSON vs масиви JavaScript</h3><p>Масиви JSON працюють майже так само, як масиви в JavaScript, і можуть містити рядки, булеві значення, числа та інші об’єкти JSON. Наприклад:</p><figure class="kg-card kg-code-card"><pre><code class="language-json">[
  {
    "name": "Jane Doe",
    "favorite-game": "Stardew Valley",
    "subscriber": false
  },
  {
    "name": "John Doe",
    "favorite-game": "Dragon Quest XI",
    "subscriber": true
  }
]
</code></pre><figcaption>profiles.json</figcaption></figure><p>У звичайному JavaScript це може виглядати так:</p><pre><code class="language-js">const profiles = [
  {
    name: 'Jane Doe',
    'favorite-game': 'Stardew Valley',
    subscriber: false
  },
  {
    name: 'John Doe',
    'favorite-game': 'Dragon Quest XI',
    subscriber: true
  }
];</code></pre><h2 id="json-">JSON як рядок</h2><p>Може виникнути запитання: якщо існують об’єкти й масиви JSON, чи не можна було б використовувати їх у своїй програмі як звичайний літерал об’єкта чи масив JavaScript?</p><p>Так не можна зробити, оскільки насправді JSON — це простий рядок.</p><p>Наприклад, коли ви пишете JSON в окремому файлі, як-от згадані вище <code>jane-profile.json</code> чи <code>profiles.json</code>, цей файл насправді містить текст у формі об’єкта JSON або масиву, який виглядає як JavaScript.</p><p>І якщо виконати запит до API, повернеться щось схоже:</p><pre><code>{"name":"Jane Doe","favorite-game":"Stardew Valley","subscriber":false}</code></pre><p>Так само як і з текстовими файлами, якщо ви хочете використати JSON у своєму проєкті, вам потрібно буде проаналізувати або змінити його на щось, зрозуміле вашій мові програмування. Наприклад, парсинг об’єкта JSON в Python створить словник.</p><p>З цими знаннями розглянемо різні способи парсингу JSON в JavaScript.</p><h2 id="-json-">Як парсити JSON у браузері</h2><p>Якщо ви працюєте з JSON у браузері, ймовірно, ви отримуєте або надсилаєте дані через API.</p><p>Розглянемо декілька прикладів.</p><h3 id="-json-fetch">Як парсити JSON за допомогою <code>fetch</code></h3><p>Найпростіший спосіб отримати дані з API — використати <code>fetch</code>, який містить метод <code>.json()</code> для автомагічного парсингу відповідей JSON у придатний для використання літерал об’єкта або масив JavaScript.</p><p>Ось деякий код, який використовує <code>fetch</code>, щоб виконати запит <code>GET</code> для жарту з безоплатного <a href="https://api.chucknorris.io/">Chuck Norris Jokes API</a>:</p><pre><code class="language-js">fetch('https://api.chucknorris.io/jokes/random?category=dev')
  .then(res =&gt; res.json()) // метод .json() парсить відповідь JSON у літерал об’єкта JS
  .then(data =&gt; console.log(data));</code></pre><p>Якщо ви запустите цей код у браузері, то побачите щось схоже на консолі:</p><pre><code class="language-js">{
    "categories": ["dev"],
    "created_at": "2020-01-05 13:42:19.324003",
    "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
    "id": "elgv2wkvt8ioag6xywykbq",
    "updated_at": "2020-01-05 13:42:19.324003",
    "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq",
    "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."
}</code></pre><p>Хоча це виглядає як об’єкт JSON, насправді це літерал об’єкта JavaScript, і ви можете вільно використовувати його у своїй програмі.</p><h3 id="-json-json-stringify-">Як перетворити JSON у рядок за допомогою <code>JSON.stringify()</code></h3><p>А якщо ви хочете надсилати дані до API?</p><p>Скажімо, ви хочете надіслати жарт про Чака Норріса до Chuck Norris Jokes API, щоб інші люди могли прочитати його пізніше.</p><p>Спочатку ви повинні написати свій жарт як літерал об’єкта JS:</p><pre><code class="language-js">const newJoke = {
  categories: ['dev'],
  value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."
};</code></pre><p>Тоді, оскільки ви надсилаєте дані до API, вам потрібно буде перетворити літерал об’єкта <code>newJoke</code> у рядок JSON.</p><p>На щастя, JavaScript містить надзвичайно корисний метод для цього — <code>JSON.stringify()</code>:</p><pre><code class="language-js">const newJoke = {
  categories: ['dev'],
  value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."
};

console.log(JSON.stringify(newJoke)); // {"categories":["dev"],"value":"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."}

console.log(typeof JSON.stringify(newJoke)); // string</code></pre><p>Хоча в цьому прикладі ми перетворюємо літерал об’єкта у рядок JSON, <code>JSON.stringify()</code> також працює з масивами.</p><p>Вкінці вам просто потрібно буде надіслати свій жарт-рядок JSON назад до API із запитом <code>POST</code>.</p><p>Зауважте, що Chuck Norris Jokes API насправді не має цієї функції. Але якби ця функція була, код був би схожим:</p><pre><code class="language-js">const newJoke = {
  categories: ['dev'],
  value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."
};

fetch('https://api.chucknorris.io/jokes/submit', { // fake API endpoint
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(newJoke), // turn the JS object literal into a JSON string
})
  .then(res =&gt; res.json())
  .then(data =&gt; console.log(data))
  .catch(err =&gt; {
    console.error(err);
  });</code></pre><p>Таким чином ви проаналізували вхідний JSON із <code>fetch</code> та використали <code>JSON.stringify()</code> для перетворення літералу об’єкта JS у рядок JSON.</p><h3 id="-json--1">Як працювати з локальними файлами JSON у браузері</h3><p>На жаль, неможливо (або небажано) завантажити локальний файл JSON у браузер.</p><p><code>fetch</code> викине помилку, якщо ви спробуєте завантажити локальний файл. Скажімо, у вас є файл JSON з парою жартів:</p><figure class="kg-card kg-code-card"><pre><code class="language-json">[
  {
    "categories": ["dev"],
    "created_at": "2020-01-05 13:42:19.324003",
    "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
    "id": "elgv2wkvt8ioag6xywykbq",
    "updated_at": "2020-01-05 13:42:19.324003",
    "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq",
    "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."
  },
  {
    "categories": ["dev"],
    "created_at": "2020-01-05 13:42:19.324003",
    "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
    "id": "ae-78cogr-cb6x9hluwqtw",
    "updated_at": "2020-01-05 13:42:19.324003",
    "url": "https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw",
    "value": "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris."
  }
]
</code></pre><figcaption>jokes.json</figcaption></figure><p>Ви хочете проаналізувати його та створити список жартів на звичайній сторінці HTML.</p><p>Якщо ви створите сторінку з наступним кодом і відкриєте її у своєму браузері:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8" /&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /&gt;
    &lt;meta name="viewport" content="width=device-width" /&gt;
    &lt;title&gt;Fetch Local JSON&lt;/title&gt;
  &lt;/head&gt;
  &lt;script&gt;
    fetch("./jokes.json", { mode: "no-cors" }) // disable CORS because path does not contain http(s)
      .then((res) =&gt; res.json())
      .then((data) =&gt; console.log(data));
  &lt;/script&gt;
&lt;/html&gt;
</code></pre><figcaption>index.html</figcaption></figure><p>На консолі ви побачите:</p><pre><code>Fetch API cannot load file://&lt;path&gt;/jokes.json. URL scheme "file" is not supported
</code></pre><p>Браузери не дозволяють доступ до локальних файлів за замовчуванням з міркувань безпеки. Це добре, і вам не варто намагатися обійти цю поведінку.</p><p>Натомість можна перетворити локальний файл JSON у JavaScript. На щастя, це досить легко, оскільки синтаксис JSON дуже схожий на JavaScript.</p><p>Все, що вам потрібно зробити, це створити новий файл і оголосити свій JSON як змінну:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const jokes = [
  {
    "categories": ["dev"],
    "created_at": "2020-01-05 13:42:19.324003",
    "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
    "id": "elgv2wkvt8ioag6xywykbq",
    "updated_at": "2020-01-05 13:42:19.324003",
    "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq",
    "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."
  },
  {
    "categories": ["dev"],
    "created_at": "2020-01-05 13:42:19.324003",
    "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
    "id": "ae-78cogr-cb6x9hluwqtw",
    "updated_at": "2020-01-05 13:42:19.324003",
    "url": "https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw",
    "value": "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris."
  }
]</code></pre><figcaption>jokes.js</figcaption></figure><p>І додати його на свою сторінку як окремий скрипт:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8" /&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /&gt;
    &lt;meta name="viewport" content="width=device-width" /&gt;
    &lt;title&gt;Fetch Local JSON&lt;/title&gt;
  &lt;/head&gt;
  &lt;script src="jokes.js"&gt;&lt;/script&gt;
  &lt;script&gt;
    console.log(jokes);
  &lt;/script&gt;
&lt;/html&gt;</code></pre><p>Ви зможете вільно використовувати масив <code>jokes</code> у своєму коді.</p><p>Ви також можете використовувати <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules"><code>модулі</code></a> JavaScript, щоб зробити те саме, але це виходить за межі публікації.</p><p>А якщо ви хочете працювати з локальними файлами JSON і маєте встановлений Node.js? Давайте розглянемо, як це зробити.</p><h2 id="-json-node-js">Як парсити JSON у Node.js</h2><p>Node.js — це середовище виконання JavaScript, яке дозволяє запустити JavaScript поза браузером. Ви можете прочитати все про <a href="https://www.freecodecamp.org/news/the-definitive-node-js-handbook-6912378afc6e/">Node.js тут</a>.</p><p>Незалежно від того, чи ви використовуєте Node.js для запуску коду локально на своєму комп’ютері чи для запуску цілих вебзастосунків на сервері, корисно знати, як працювати з JSON.</p><p>Для наступних прикладів ми використовуватимемо той самий файл <code>jokes.json</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-json">[
  {
    "categories": ["dev"],
    "created_at": "2020-01-05 13:42:19.324003",
    "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
    "id": "elgv2wkvt8ioag6xywykbq",
    "updated_at": "2020-01-05 13:42:19.324003",
    "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq",
    "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."
  },
  {
    "categories": ["dev"],
    "created_at": "2020-01-05 13:42:19.324003",
    "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
    "id": "ae-78cogr-cb6x9hluwqtw",
    "updated_at": "2020-01-05 13:42:19.324003",
    "url": "https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw",
    "value": "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris."
  }
]</code></pre><figcaption>jokes.json</figcaption></figure><h3 id="-json-require-">Як парсити файл JSON за допомогою <code>require()</code></h3><p>Почнемо з найпростішого методу.</p><p>Якщо у вас є локальний файл JSON, вам потрібно лише використати <code>require()</code>, щоб завантажити його, як і будь-який інший модуль Node.js:</p><pre><code class="language-js">const jokes = require('./jokes.json');</code></pre><p>Файл JSON буде автоматично аналізований, і ви зможете використовувати його у своєму проєкті:</p><pre><code class="language-js">const jokes = require('./jokes.json');

console.log(jokes[0].value); // "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</code></pre><p>Зверніть увагу, що це синхронно, тобто ваша програма зупиниться, доки весь файл не буде проаналізований. Дійсно великі файли JSON можуть спричинити сповільнення вашої програми, тому будьте обережні з цим.</p><p>Також, оскільки парсинг JSON таким чином завантажує все в пам’ять, краще використовувати цей метод для статичних файлів JSON. Якщо файл JSON зміниться під час роботи програми, ви не матимете доступу до цих змін, доки не перезапустите програму та не проаналізуєте оновлений файл JSON.</p><h3 id="-json-fs-readfilesync-json-parse-">Як парсити файл JSON за допомогою <code>fs.readFileSync()</code> та <code>JSON.parse()</code></h3><p>Традиційніший спосіб (через відсутність кращого терміну) парсингу файлів JSON у проєктах Node.js — прочитати файл за допомогою <code>fs</code> (файлова система), а потім проаналізувати за допомогою <code>JSON.parse()</code>.</p><p>Подивимося, як це зробити з методом <code>fs.readFileSync()</code>. Спочатку додайте модуль <code>fs</code> до свого проєкту:</p><pre><code class="language-js">const fs = require('fs');
</code></pre><p>Потім створіть нову змінну для зберігання виводу файлу <code>jokes.json</code> та встановіть для неї значення <code>fs.readFileSync()</code>:</p><pre><code class="language-js">const fs = require('fs');
const jokesFile = fs.readFileSync();</code></pre><p><code>fs.readFileSync()</code> приймає декілька аргументів. Першим є шлях до файлу, який ви хочете прочитати:</p><pre><code class="language-js">const fs = require('fs');
const jokesFile = fs.readFileSync('./jokes.json');</code></pre><p>Але якщо зараз ви введете <code>jokesFile</code> на консолі, то побачите щось подібне:</p><pre><code>&lt;Buffer 5b 0a 20 20 7b 0a 20 20 20 20 22 63 61 74 65 67 6f 72 69 65 73 22 3a 20 5b 22 64 65 76 22 5d 2c 0a 20 20 20 20 22 63 72 65 61 74 65 64 5f 61 74 22 3a ... 788 more bytes&gt;</code></pre><p>Це означає, що модуль <code>fs</code> читає файл, але він не знає кодування чи формат файлу. <code>fs</code> можна використовувати для завантаження майже будь-якого файлу, а не лише текстових, як-от JSON, тому нам потрібно сказати, як файл закодовано.</p><p>Для текстових файлів зазвичай використовують <code>utf8</code>:</p><pre><code class="language-js">const fs = require('fs');
const jokesFile = fs.readFileSync('./jokes.json', 'utf8');</code></pre><p>Якщо зараз ввести <code>jokesFile</code> на консолі, ви побачите вміст файлу.</p><p>Але поки що ми просто читаємо файл, і він досі є рядком. Нам знадобиться використати інший метод, щоб розібрати <code>jokesFile</code> у придатний для використання об’єкт або масив JavaScript.</p><p>Для цього ми використаємо <code>JSON.parse()</code>:</p><pre><code class="language-js">const fs = require('fs');
const jokesFile = fs.readFileSync('./jokes.json', 'utf8');
const jokes = JSON.parse(jokesFile);

console.log(jokes[0].value); // "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</code></pre><p>Як випливає з назви, <code>JSON.parse()</code> бере рядок JSON та аналізує його в літерал об’єкта або масив JavaScript.</p><p>Подібно до наведеного вище методу <code>require</code>, <code>fs.readFileSync()</code> також синхронний метод, а це означає що він може призвести до сповільнення вашої програми, якщо вона читає великий файл (JSON чи інший).</p><p>Крім того, він читає файл лише один раз та завантажує його в пам’ять. Якщо файл змінюється, вам потрібно буде прочитати файл знову. Для полегшення ви можете створити функцію для читання файлів.</p><p>Ось як це може виглядати:</p><pre><code class="language-js">const fs = require('fs');
const readFile = path =&gt; fs.readFileSync(path, 'utf8');

const jokesFile1 = readFile('./jokes.json');
const jokes1 = JSON.parse(jokesFile1);

console.log(jokes1[0].value); // "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."

// the jokes.json file changes at some point

const jokesFile2 = readFile('./jokes.json');
const jokes2 = JSON.parse(jokesFile2);

console.log(jokes2[0].value); // "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."</code></pre><h3 id="-json-fs-readfile-json-parse-">Як парсити JSON за допомогою <code>fs.readFile()</code> та <code>JSON.parse()</code></h3><p>Метод <code>fs.readFile()</code> дуже схожий на <code>fs.readFileSync()</code>, але він працює асинхронно. Це чудово, якщо у вас є великий файл для читання, і ви не хочете, щоб він затримував решту вашого коду.</p><p>Ось базовий приклад:</p><pre><code class="language-js">const fs = require('fs');

fs.readFile('./jokes.json', 'utf8');</code></pre><p>Поки що це виглядає подібно до того, що ми робили з <code>fs.readFileSync()</code>, за винятком того, що ми не призначаємо його змінній, як-от <code>jokesFile</code>. Оскільки цей метод асинхронний, будь-який код після <code>fs.readFile()</code> буде виконано до завершення читання файлу.</p><p>Замість цього ми використаємо функцію зворотного виклику та проаналізуємо JSON у ній:</p><pre><code class="language-js">const fs = require('fs');

fs.readFile('./jokes.json', 'utf8', (err, data) =&gt; {
  if (err) console.error(err);
  const jokes = JSON.parse(data);

  console.log(jokes[0].value);
});

console.log("This will run first!");</code></pre><p>На консолі буде виведено наступне:</p><pre><code>This will run first!
Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris.</code></pre><p>Подібно до <code>fs.readFileSync()</code>, <code>fs.readFile()</code> завантажує файл у пам’ять, а це означає, що вам доведеться прочитати файл знову, якщо він зміниться.</p><p>Крім того, всупереч тому, що <code>fs.readFile()</code> є асинхронним, він завантажує весь файл, який читає, у пам’ять. Якщо у вас масивний файл, можливо, краще переглянути <a href="https://www.freecodecamp.org/news/node-js-streams-everything-you-need-to-know-c9141306be93/">потоки Node.js</a>.</p><h3 id="-json-json-stringify-node-js">Як перетворити JSON у рядок за допомогою <code>JSON.stringify()</code> у Node.js</h3><p>Зрештою, якщо ви аналізуєте JSON за допомогою Node.js, є великі шанси, що колись вам доведеться повернути JSON як відповідь API.</p><p>На щастя, це працює так само, як і в браузері: просто використайте <code>JSON.stringify()</code>, щоб перетворити літерали об’єктів або масивів JavaScript &nbsp;у рядок JSON:</p><pre><code class="language-js">const newJoke = {
  categories: ['dev'],
  value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."
};

console.log(JSON.stringify(newJoke)); // {"categories":["dev"],"value":"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."}</code></pre><p>Це все! Ми розглянули практично все, що вам потрібно знати про роботу з JSON у браузері та проєктах Node.js.</p><p>А тепер вирушайте та перетворюйте JSON в рядки чи аналізуйте їх скільки душі завгодно.</p><p>Я щось пропустив? Як ви аналізуєте JSON у своїх проєктах? Дайте мені знати у <a href="https://twitter.com/kriskoishigawa">твіттері</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ forEach у JavaScript: як циклічно переглянути масив у JS ]]>
                </title>
                <description>
                    <![CDATA[ Метод forEach у JavaScript — це один із декількох способів пройти масив циклічно. Кожен метод має свої особливості, і вам, залежно від того, що ви робите, вирішувати, який з них використовувати. У цій публікації ми докладніше розглянемо метод forEach у JavaScript. Враховуючи, що ми маємо наступний масив: const числа = ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/foreach-u-javascript-yak-tsyklichno-perehlyanuty-masyv-u-js/</link>
                <guid isPermaLink="false">63023f551176440771bf45cc</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ rustamdocstranslator ]]>
                </dc:creator>
                <pubDate>Fri, 25 Nov 2022 06:03:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2022/08/4FF9B0F5-83C5-44E4-9C89-BAC78F00FD3E.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/javascript-foreach-how-to-loop-through-an-array-in-js/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript forEach – How to Loop Through an Array in JS</a>
      </p><p>Метод forEach у JavaScript — це один із декількох способів пройти масив циклічно. Кожен метод має свої особливості, і вам, залежно від того, що ви робите, вирішувати, який з них використовувати.</p><p>У цій публікації ми докладніше розглянемо метод forEach у JavaScript.</p><p>Враховуючи, що ми маємо наступний масив:</p><pre><code class="language-javascript">const числа = [1, 2, 3, 4, 5];</code></pre><p>Використання традиційного циклу for для проходження масиву буде таким:</p><pre><code class="language-javascript">for (i = 0; i &lt; числа.length; i++) {
  console.log(числа[i]);
}</code></pre><h2 id="-foreach-">Чим особливий метод forEach( )?</h2><p>Метод forEach також використовується для циклічного проходження масивів, але у порівнянні із циклом for він використовує функцію по-іншому.</p><p>Метод forEach передає <a href="https://www.freecodecamp.org/news/javascript-callback-functions-what-are-callbacks-in-js-and-how-to-use-them/">функцію зворотного виклику</a> для кожного елемента масиву разом з такими параметрами:</p><ul><li>Поточне значення (обов’язково) — значення поточного елемента масиву</li><li>Індекс (необов’язково) — номер індексу поточного елемента</li><li>Масив (необов’язково) — об’єкт масиву, до якого належить поточний елемент</li></ul><p>Поясню ці параметри покроково.</p><p>По-перше, щоб пройти масив за допомогою методу forEach, вам потрібна функція зворотного виклику (або анонімна функція):</p><pre><code class="language-javascript">числа.forEach(function() {
    // код
});</code></pre><p>Функція буде виконана для кожного окремого елемента масиву. Вона повинна приймати принаймні один параметр, який представляє елементи масиву:</p><pre><code class="language-javascript">числа.forEach(function(число) {
    console.log(число);
});</code></pre><p>Це все, що нам потрібно зробити для циклічного проходження масиву:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/Ads-z-2.png" class="kg-image" alt="Ads-z-2" width="600" height="400" loading="lazy"></figure><p>Альтернативно, ви можете використати представлення стрілкової функції ES6, щоб спростити код:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">числа.forEach(число =&gt; console.log(число));</code></pre><figcaption>Представлення стрілкової функції</figcaption></figure><h2 id="-">Додаткові параметри</h2><h3 id="--1">Індекс</h3><p>Зараз продовжимо із додатковими параметрами. Першим є параметр «індекс», який представляє номер індексу кожного елемента.</p><p>По суті, ми можемо побачити номер індексу елемента, якщо додамо його як другий параметр:</p><pre><code class="language-javascript">числа.forEach((число, індекс) =&gt; {
    console.log('Індекс: ' + індекс + ' Значення: ' + число);
});</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/ukrainian/news/content/images/2022/08/screenshot-4.png" class="kg-image" alt="screenshot-4" srcset="https://www.freecodecamp.org/ukrainian/news/content/images/size/w600/2022/08/screenshot-4.png 600w, https://www.freecodecamp.org/ukrainian/news/content/images/2022/08/screenshot-4.png 720w" sizes="(min-width: 720px) 720px" width="720" height="149" loading="lazy"></figure><h3 id="--2">Масив</h3><p>Параметр «масив» — це сам масив. Він також необов’язковий і може використовуватися при необхідності в різних операціях. В іншому випадку, якщо ми викличемо його, він просто буде надрукований стільки разів, скільки елементів в масиві:</p><pre><code class="language-javascript">числа.forEach((число, індекс, масив) =&gt; {
    console.log(масив);
});</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/07/Ads-z.png" class="kg-image" alt="Ads-z" width="600" height="400" loading="lazy"></figure><h2 id="--3">Підтримка браузера</h2><p>Метод Array.forEach підтримується в усіх браузерах, окрім Internet Explorer 8 або ранішого:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/06/Ads-z.png" class="kg-image" alt="Ads-z" width="600" height="400" loading="lazy"><figcaption><a href="https://caniuse.com">caniuse.com</a></figcaption></figure><p>Дякую, що прочитали!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Форматування дати й часу в JavaScript одним рядком коду ]]>
                </title>
                <description>
                    <![CDATA[ Довгий час я користувався бібліотеками, як-от Date-fns, коли мені потрібно було встановити дату в JavaScript. Але їх дивно використовувати у малих проєктах, що вимагають простих форматів дати й часу, які JavaScript пропонує за замовчуванням. Я дізнався, що так робить багато розробників. І я думав, що це найкращий спосіб, допоки не ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/formatuvannya-daty-y-chasu-v-javascript-odnym-ryadkom-kodu/</link>
                <guid isPermaLink="false">6345452673c1c406e9e0f42e</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Anastasiia Buievych ]]>
                </dc:creator>
                <pubDate>Mon, 17 Oct 2022 19:23:23 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2022/10/cold--smooth---tasty..png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/how-to-format-dates-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Format Dates in JavaScript with One Line of Code</a>
      </p><p>Довгий час я користувався бібліотеками, як-от <code>Date-fns</code>, коли мені потрібно було встановити дату в JavaScript. Але їх дивно використовувати у малих проєктах, що вимагають простих форматів дати й часу, які JavaScript пропонує за замовчуванням.</p><p>Я дізнався, що так робить багато розробників. І я думав, що це найкращий спосіб, допоки не зрозумів, що <strong>не завжди потрібно використовувати бібліотеки</strong> для форматування дат в JavaScript<strong><strong>.</strong></strong></p><p>Якщо хочете спробувати, ось код:👇</p><pre><code class="language-javascript">new Date().toLocaleDateString('en-us', { weekday:"long", year:"numeric", month:"short", day:"numeric"}) 
// "Friday, Jul 2, 2021"</code></pre><p>Ви, мабуть, спробували його та побачили, що все працює. Давайте розберемось, як працює цей код та дізнаємось про інші способи форматування дати в JavaScript за допомогою лише одного рядка коду.</p><h1 id="-js"><strong>Як форматувати дату й час у JS</strong></h1><p>Отримати дату й час у JavaScript не викликає проблем, але їхнє форматування може здатись важким для початківців. Через це багато людей користуються бібліотеками.</p><p><code>new Date()</code> — це найпоширеніший метод отримання дати й часу в JavaScript.</p><p>За замовчуванням, коли ви запускаєте <code>new Date()</code> у своєму терміналі, використовується часовий пояс вашого браузера та дата/час показані як повний текстовий рядок, наприклад <strong><strong>Fri Jul 02 2021 12:44:45 GMT+0100 (British Summer Time).</strong></strong></p><p>Але мати щось подібне на вебсторінці або в додатку — непрофесійно та важко для читання. Тому потрібно знайти кращі способи для форматування дати й часу.</p><p>Розглянемо деякі методи, які працюють для дати й часу.</p><h1 id="-javascript"><strong>Методи дати й часу в JavaScript</strong></h1><p>Існує багато методів, які можна застосувати до дати й часу. Ці методи можна використовувати, щоб отримати інформацію щодо дати й часу. Ось декілька з них:</p><ul><li><code>getFullYear()</code> — для отримання року як чотиризначного числа (yyyy)</li><li><code>getMonth()</code> — для отримання місяця як числа (0-11)</li><li><code>getDate()</code> — для отримання дня як числа (1-31)</li><li><code>getHours()</code> — для отримання години (0-23)</li></ul><p>І багато інших…</p><p>На жаль, більшість цих методів однаково потребує багато коду для того формату дати й часу, який ми хочемо.</p><p>Наприклад, <code>new Date().getMonth()</code> виведе 6, що означає <strong>липень<strong>. </strong></strong>Щоб використати липень у моєму коді, мені знадобиться дуже великий код, що може бути громіздким:</p><pre><code class="language-javascript">const currentMonth = new Date();
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
console.log(months[currentMonth.getMonth()]);</code></pre><p>Давайте розглянемо два методи, які можна використовувати для форматування дати й часу у своїх проєктах.</p><h2 id="-todatestring-javascript"><strong>Метод toDateString() у JavaScript</strong></h2><p>Метод <code>toDateString()</code> повертає частину дати й часу у вигляді рядка, використовуючи наступний формат:</p><ol><li>Перші три літери дня </li><li>Перші три літери місяця</li><li>Дві цифри, що позначають день (за потреби з нулями зліва)</li><li>Принаймні чотири цифри, що позначають рік (за потреби з нулями зліва)</li></ol><pre><code class="language-javascript">new Date().toDateString();
//"Fri Jul 02 2021"</code></pre><p>Одним з головних недоліків цього методу є наша нездатність маніпулювати виводом дати й часу так, як ми хочемо.</p><p>Наприклад, ми не маємо можливості показувати дату й час відповідно до нашої мови. Розглянемо ще один метод, який, на мій погляд, один із найкращих.</p><h2 id="-tolocaledatestring-javascript"><strong>Метод toLocaleDateString() у JavaScript</strong></h2><p>Цей метод повертає дату й час як рядок, використовуючи локальні норми. Він також приймає параметри як аргументи, що дозволяє вам/вашим програмам налаштувати поведінку функції.</p><p><strong>Синтаксис<strong>:</strong></strong></p><pre><code class="language-javascript">toLocaleDateString()
toLocaleDateString(locales)
toLocaleDateString(locales, options)</code></pre><p>Розглянемо приклади та їхні виводи:</p><pre><code class="language-javascript">const currentDate = new Date();

const options = { weekday: 'long', year: 'numeric', month: 'short', day: 'numeric' };

console.log(currentDate.toLocaleDateString('de-DE', options));
//Freitag, 2. Juli 2021

console.log(currentDate.toLocaleDateString('ar-EG', options))
// الجمعة، ٢ يوليو ٢٠٢١

console.log(currentDate.toLocaleDateString('en-us', options));
//Friday, Jul 2, 2021</code></pre><p><br>Можна не використовувати локалі або параметри:</p><pre><code class="language-javascript">new Date().toLocaleDateString()
// "7/2/2021"</code></pre><p>А ще можна використовувати лише локаль. Це виведе таку саму інформацію, що в попередньому прикладі, базуючись на часовому поясі мого браузера.</p><pre><code class="language-javascript">new Date().toLocaleDateString('en-US')
"7/2/2021"</code></pre><p>Параметри можна змінювати за бажанням. Ось 4 основні параметри:</p><ul><li><code>weekday</code> — виводить день залежно від того, як ви хочете (короткий чи довгий)</li><li><code>year</code> — виводить рік як число</li><li><code>month</code> — виводить місяць залежно від того, як ви хочете (короткий чи довгий)</li><li><code>day</code> — виводить день як число</li></ul><pre><code class="language-javascript">new Date().toLocaleDateString('en-us', { weekday:"long", year:"numeric", month:"short"}) // "Jul 2021 Friday"

new Date().toLocaleDateString('en-us', { year:"numeric", month:"short"})
// "Jul 2021"</code></pre><h1 id="-"><strong>Висновок</strong></h1><p>Дату і час можна відобразити сімома різними методами. Кожен з цих методів надає певне значення:</p><ol><li><code>toString()</code> надає <strong><strong>Fri Jul 02 2021 14:03:54 GMT+0100 (British Summer Time)</strong></strong></li><li><code>toDateString()</code> надає <strong><strong>Fri Jul 02 2021</strong></strong></li><li><code>toLocaleString()</code> надає <strong><strong>7/2/2021, 2:05:07 PM</strong></strong></li><li><code>toLocaleDateString()</code> надає <strong><strong>7/2/2021</strong></strong></li><li><code>toGMTString()</code> надає <strong><strong>Fri, 02 Jul 2021 13:06:02 GMT</strong></strong></li><li><code>toUTCString()</code> надає <strong><strong>Fri, 02 Jul 2021 13:06:28 GMT</strong></strong></li><li><code>toISOString()</code> надає <strong><strong>2021-07-02T13:06:53.422Z</strong></strong></li></ol><p>Якщо ви шукаєте передовіші формати дати, вам потрібно буде створити спеціальний формат самостійно.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Як перевірити, чи масив JavaScript порожній (за допомогою .length) ]]>
                </title>
                <description>
                    <![CDATA[ Коли ви програмуєте в JavaScript, вам, можливо, знадобиться перевірити, чи порожній масив. Щоб перевірити, порожній масив чи ні, ви можете скористатися властивістю .length. Властивість length встановлює або повертає кількість елементів в масиві. Знаючи кількість елементів в масиві, можна визначити, порожній він чи ні. Порожній масив матиме 0 елементів всередині. Пробіжимося ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/yak-pereviryty-chy-masyv-javascript-porozhniy-za-dopomohoyu-length/</link>
                <guid isPermaLink="false">6302948ca402f907381bf726</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ rustamdocstranslator ]]>
                </dc:creator>
                <pubDate>Mon, 19 Sep 2022 17:57:10 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2022/08/8A19E3C4-9FD7-493F-9EFF-5C819ECF1781.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/check-if-javascript-array-is-empty-or-not-with-length/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Check if a JavaScript Array is Empty or Not with .length</a>
      </p><p>Коли ви програмуєте в JavaScript, вам, можливо, знадобиться перевірити, чи порожній масив.</p><p>Щоб перевірити, порожній масив чи ні, ви можете скористатися властивістю .length.</p><p>Властивість length встановлює або повертає кількість елементів в масиві. Знаючи кількість елементів в масиві, можна визначити, порожній він чи ні. Порожній масив матиме <code>0</code> елементів всередині.</p><p>Пробіжимося по прикладах.</p><h2 id="-length">Приклад синтаксису .length</h2><pre><code class="language-javascript">Const myArray = [‘Horses’, ‘Dogs’, ‘Cats’];</code></pre><p>Тут ми створюємо змінну, яка вказує на масив.</p><p>Використовуючи властивість length, ми можемо перевірити довжину масиву:</p><pre><code class="language-javascript">myArray.length</code></pre><p>Це поверне 3, оскільки в масиві 3 елементи.</p><p>Існує три способи перевірити, порожній масив чи ні, за допомогою .length.</p><h3 id="-"><strong>Перший приклад</strong></h3><p>Спочатку створимо новий масив без елементів.</p><pre><code class="language-javascript">const arr = []</code></pre><p>Тепер ми можемо перевірити, чи масив порожній, використовуючи <code>.length</code>.</p><pre><code class="language-javascript">arr.length</code></pre><p>Це поверне 0, оскільки в масиві 0 елементів.</p><h3 id="--1"><strong>Другий приклад</strong></h3><p>Ми також можемо прямо перевірити, порожній масив чи ні.</p><p><code>if (arr.length === 0) { console.log("Array is empty!") }</code></p><p>Якщо наш масив порожній, буде надруковано повідомлення вище. Якщо в масиві є елементи, код в блоці <code>if</code> не виконуватиметься.</p><h3 id="--2"><strong>Третій приклад</strong></h3><p>Поєднуючи властивість length та логічний оператор «не» в JavaScript — символ «!» — ми можемо перевірити, порожній масив чи ні.</p><p>Оператор <code>!</code> заперечує вираз. Його можна використати для повернення <code>true</code>, якщо масив порожній.</p><p>Для цього прикладу відкриємо нашу консоль JavaScript. </p><p>Спочатку створимо масив без елементів у ньому.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/10/image.png" class="kg-image" alt="image" width="600" height="400" loading="lazy"></figure><p>Далі використаємо логічний оператор «не» разом із нашою властивістю .length, щоб протестувати, порожній масив чи ні.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/10/Screen-Shot-2020-09-30-at-5.29.35-PM.png" class="kg-image" alt="Screen-Shot-2020-09-30-at-5.29.35-PM" width="600" height="400" loading="lazy"></figure><p>Якби ми не використали оператор «не», <code>arr.length</code> повернув би <code>0</code>. З доданим оператором він поверне <code>true</code>, якщо його операнд <code>false</code>. Оскільки arr.length дорівнює <code>0</code>, або false, він повертає <code>true</code>.</p><p>Використаємо твердження <code>if</code> та надрукуємо повідомлення, якщо наш масив порожній.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/10/image-2.png" class="kg-image" alt="image-2" width="600" height="400" loading="lazy"></figure><p>Коли перевіряєте, порожній масив чи ні, варто перевірити, чи справді масив є масивом.</p><p>Чому?</p><p>Тому що ви могли очікувати перевірити довжину масиву, але натомість у вас інший тип даних, наприклад, рядок:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/10/image-7.png" class="kg-image" alt="image-7" width="600" height="400" loading="lazy"></figure><p>Оскільки властивість <code>length</code> можна використовувати на інших типах даних, краще перевірити, чи ваш масив справді є масивом.</p><p>Я рекомендую використовувати метод <code>Array.isArray()</code>, щоб підтвердити, що масив є масивом. Цей метод визначає, чи передане є масивом. Якщо передане є масивом, цей метод поверне <code>true</code>.</p><p>Додамо цей метод до нашого прикладу.</p><h3 id="-array-isarray-">Як використовувати метод Array.isArray()</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/10/image-3.png" class="kg-image" alt="image-3" width="600" height="400" loading="lazy"></figure><h2 id="--3">Підіб’ємо підсумки</h2><p>У цій публікації ми дізналися, що ви можете використовувати властивість <code>length</code> в JavaScript різними способами, щоб перевірити, чи масив порожній, чи ні. Властивість <code>length</code> повертає кількість елементів в масиві.</p><p>Ми також дізналися, що найкраще використовувати <code>Array.isArray</code> під час використання властивості <code>.length</code>, щоб перевірити, чи передане значення справді є масивом.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Як клонувати масив в JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ В JavaScript є багато способів зробити що завгодно. Зараз ми будемо працювати з масивами. 1. Оператор Spread (поверхнева копія) З того часу, як з’явився ES6 — це найпопулярніший метод. Це короткий синтаксис, який є неймовірно корисним під час використання таких бібліотек, як React і Redux. numbers = [1, 2, 3]; ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/yak-klonuvaty-masyv-v-javascript/</link>
                <guid isPermaLink="false">6310c8f83904ca06d72df9a5</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ rustamdocstranslator ]]>
                </dc:creator>
                <pubDate>Mon, 19 Sep 2022 17:52:43 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2022/09/B29127B2-8E78-47DB-B634-0F800F4688F2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/how-to-clone-an-array-in-javascript-1d3183468f6a/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to clone an array in JavaScript</a>
      </p><p>В JavaScript є багато способів зробити що завгодно. Зараз ми будемо працювати з масивами.</p><h3 id="1-spread-"><strong>1. Оператор Spread (поверхнева копія)</strong></h3><p>З того часу, як з’явився ES6 — це найпопулярніший метод. Це короткий синтаксис, який є неймовірно корисним під час використання таких бібліотек, як React і Redux.</p><pre><code class="language-js">numbers = [1, 2, 3];
numbersCopy = [...numbers];
</code></pre><p><strong>Примітка:</strong> ненадійно копіює багатовимірні масиви. Значення масиву/об’єкта копіюються за <em>посиланням</em>, а не за <em>значенням</em>.</p><p>Це добре:</p><pre><code class="language-js">numbersCopy.push(4);
console.log(numbers, numbersCopy);
// [1, 2, 3] та [1, 2, 3, 4]
// числа залишаються без змін
</code></pre><p>Це не добре:</p><pre><code class="language-js">nestedNumbers = [[1], [2]];
numbersCopy = [...nestedNumbers];

numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// Обоє були змінені, оскільки мають спільні посилання
</code></pre><h3 id="2-for-"><strong>2. Старий добрий цикл for() (поверхнева копія)</strong></h3><p>Я думаю, що цей підхід <em>найменш</em> популярний, враховуючи, наскільки трендовим стало функціональне програмування в наших колах.</p><p>Чистий чи нечистий, декларативний чи імперативний, він виконує роботу!</p><pre><code class="language-js">numbers = [1, 2, 3];
numbersCopy = [];

for (i = 0; i &lt; numbers.length; i++) {
  numbersCopy[i] = numbers[i];
}
</code></pre><p><strong>Примітка:</strong> ненадійно копіює багатовимірні масиви. Оскільки ви використовуєте оператор <code>=</code>, він призначатиме об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><p>Це добре:</p><pre><code class="language-js">numbersCopy.push(4);
console.log(numbers, numbersCopy);
// [1, 2, 3] та [1, 2, 3, 4]
// числа залишаються без змін
</code></pre><p>Це не добре:</p><pre><code class="language-js">nestedNumbers = [[1], [2]];
numbersCopy = [];

for (i = 0; i &lt; nestedNumbers.length; i++) {
  numbersCopy[i] = nestedNumbers[i];
}

numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// Обоє були змінені, оскільки мають спільні посилання</code></pre><h3 id="3-while-"><strong>3. Старий добрий цикл while() (поверхнева копія)</strong></h3><p>Такий самий, що й <code>for</code>: нечистий, імперативний, бла-бла-бла… Але працює!?</p><pre><code class="language-js">numbers = [1, 2, 3];
numbersCopy = [];
i = -1;

while (++i &lt; numbers.length) {
  numbersCopy[i] = numbers[i];
}
</code></pre><p><strong>Примітка:</strong> також призначає об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><p>Це добре:</p><pre><code class="language-js">numbersCopy.push(4);
console.log(numbers, numbersCopy);
// [1, 2, 3] та [1, 2, 3, 4]
// числа залишаються без змін
</code></pre><p>Це не добре:</p><pre><code class="language-js">nestedNumbers = [[1], [2]];
numbersCopy = [];

i = -1;

while (++i &lt; nestedNumbers.length) {
  numbersCopy[i] = nestedNumbers[i];
}

numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// Обоє були змінені, оскільки мають спільні посилання
</code></pre><h3 id="4-array-map-"><strong>4. Array.map (поверхнева копія)</strong></h3><p>На сучасній території ми знайдемо функцію <code>map</code>. <a href="https://uk.wikipedia.org/wiki/%D0%9C%D0%BE%D1%80%D1%84%D1%96%D0%B7%D0%BC">Закорінена в математиці</a> <code>map</code> — це концепція перетворення множини в множину іншого типу зі збереженням структури.</p><p>Простими словами: <code>Array.map</code> повертає масив тої самої довжини кожного разу.</p><p>Щоб подвоїти список чисел, використайте <code>map</code> із функцією <code>double</code>.</p><pre><code class="language-js">numbers = [1, 2, 3];
double = (x) =&gt; x * 2;

numbers.map(double);
</code></pre><h4 id="-">А як щодо клонування??</h4><p>Правда, ця публікація про клонування масивів. Щоб дублювати масив, просто поверніть елемент у виклику <code>map</code>.</p><pre><code class="language-js">numbers = [1, 2, 3];
numbersCopy = numbers.map((x) =&gt; x);
</code></pre><p>Якщо ви хочете побути математиками, <code>(x) =&gt; x</code> називається <a href="https://uk.wikipedia.org/wiki/%D0%A2%D0%BE%D1%82%D0%BE%D0%B6%D0%BD%D0%B5_%D0%B2%D1%96%D0%B4%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F">тотожністю</a>. Вона повертає будь-який параметр, який було надано.</p><p><code>map(identity)</code> клонує список.</p><pre><code class="language-js">identity = (x) =&gt; x;
numbers.map(identity);
// [1, 2, 3]
</code></pre><p><strong>Примітка:</strong> також призначає об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><h3 id="5-array-filter-"><strong>5. Array.filter (поверхнева копія)</strong></h3><p>Ця функція повертає масив, як і <code>map</code>, але не гарантовано, що він буде такої ж довжини.</p><p>А якщо відфільтрувати парні числа?</p><pre><code class="language-js">[1, 2, 3].filter((x) =&gt; x % 2 === 0);
// [2]
</code></pre><p>Довжина вхідного масиву дорівнює 3, а вихідного — 1.</p><p>Проте, якщо предикат вашого <code>filter</code> завжди повертає <code>true</code>, ви отримаєте дублікат!</p><pre><code class="language-js">numbers = [1, 2, 3];
numbersCopy = numbers.filter(() =&gt; true);
</code></pre><p>Кожен елемент проходить тест, тому він повертається.</p><p><strong>Примітка:</strong> також призначає об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><h3 id="6-array-reduce-"><strong>6. Array.reduce (поверхнева копія)</strong></h3><p>Мені ніяково використовувати <code>reduce</code> для клонування масиву, тому що вона набагато потужніша за це. Але раз ви просите…</p><pre><code class="language-js">numbers = [1, 2, 3];

numbersCopy = numbers.reduce((newArray, element) =&gt; {
  newArray.push(element);

  return newArray;
}, []);
</code></pre><p><code>reduce</code> перетворює початкове значення, коли воно проходить список.</p><p>В прикладі початкове значення є порожнім масивом і ми заповнюємо його кожним елементом на ходу. Цей масив повинен бути повернений з функції, щоб його використати в наступній ітерації.</p><p><strong>Примітка:</strong> також призначає об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><h3 id="7-array-slice-"><strong>7. Array.slice (поверхнева копія)</strong></h3><p><code>slice</code> повертає <em>поверхневу</em> копію масиву на основі наданого вами початкового/кінцевого індексу.</p><p>Якщо ми хочемо перші 3 елементи:</p><pre><code class="language-js">[1, 2, 3, 4, 5].slice(0, 3);
// [1, 2, 3]
// Починається з індексу 0, закінчується на індексі 3
</code></pre><p>Якщо ми хочемо всі елементи, не вказуємо жодних параметрів:</p><pre><code class="language-js">numbers = [1, 2, 3, 4, 5];
numbersCopy = numbers.slice();
// [1, 2, 3, 4, 5]
</code></pre><p><strong>Примітка:</strong> це <em>поверхнева</em> копія, тому вона також призначає об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><h3 id="8-json-parse-json-stringify-"><strong>8. JSON.parse та JSON.stringify (глибока копія)</strong></h3><p><code>JSON.stringify</code> перетворює об’єкт на рядок.</p><p><code>JSON.parse</code> перетворює рядок на об’єкт.</p><p>Якщо їх поєднати, то можна перетворити об’єкт на рядок, а потім змінити процес навпаки, щоб створити нову структуру даних.</p><p><strong>Примітка: надійно копіює глибоко вкладені об’єкти/масиви!</strong></p><pre><code class="language-js">nestedNumbers = [[1], [2]];
numbersCopy = JSON.parse(JSON.stringify(nestedNumbers));

numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);

// [[1], [2]]
// [[1, 300], [2]]
// Два абсолютно окремі масиви!
</code></pre><h3 id="9-array-concat-"><strong>9. Array.concat (поверхнева<em> </em>копія)</strong></h3><p><code>concat</code> поєднує масиви зі значеннями або іншими масивами.</p><pre><code class="language-js">[1, 2, 3].concat(4); // [1, 2, 3, 4]
[1, 2, 3].concat([4, 5]); // [1, 2, 3, 4, 5]
</code></pre><p>Якщо ви не надасте нічого або порожній масив, повернеться поверхнева копія.</p><pre><code class="language-js">[1, 2, 3].concat(); // [1, 2, 3]
[1, 2, 3].concat([]); // [1, 2, 3]
</code></pre><p><strong>Примітка:</strong> також призначає об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><h3 id="10-array-from-"><strong>10. Array.from (поверхнева копія)</strong></h3><p>Може перетворити будь-який ітерований об’єкт в масив. Надання масиву повертає поверхневу копію.</p><pre><code class="language-js">numbers = [1, 2, 3];
numbersCopy = Array.from(numbers);
// [1, 2, 3]
</code></pre><p><strong>Примітка:</strong> також призначає об’єкти/масиви за <em>посиланням</em>, а не за <em>значенням</em>.</p><h3 id="--1">Висновок</h3><p>Ну, було весело?</p><p>Я спробував клонувати, використовуючи лише 1 крок. Ви знайдете ще багато інших способів, якщо використаєте декілька методів та технік.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Яка різниця між Var, Let та Const? ]]>
                </title>
                <description>
                    <![CDATA[ В ES2015 (ES6) з’явилось багато блискучих функцій. Вже минуло більше п’яти років і можна припустити, що багато розробників JavaScript ознайомилися з цими функціями та почали їх використовувати. Хоча це припущення і може бути частково правильним, деякі функції досі залишаються загадкою. Одними з функцій в ES6 є let та const, які ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/yaka-riznytsya-mizh-var-let-ta-const/</link>
                <guid isPermaLink="false">631cc1fce16faf078a4c46b2</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ rustamdocstranslator ]]>
                </dc:creator>
                <pubDate>Mon, 19 Sep 2022 17:41:37 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2022/09/3D630CA4-DE75-441C-B46C-5001B636E4C5.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Var, Let, and Const – What's the Difference?</a>
      </p><p>В ES2015 (ES6) з’явилось багато блискучих функцій. Вже минуло більше п’яти років і можна припустити, що багато розробників JavaScript ознайомилися з цими функціями та почали їх використовувати.</p><p>Хоча це припущення і може бути частково правильним, деякі функції досі залишаються загадкою.</p><p>Одними з функцій в ES6 є <code>let</code> та <code>const</code>, які можна використовувати для оголошення змінних. Питання в тому, чим вони відрізняються від <code>var</code>, якою ми користувалися? Якщо ви досі не зрозуміли, то ця публікація для вас.</p><p>У цій статті ми обговоримо <code>var</code>, <code>let</code> та <code>const</code> щодо області видимості, використання та підняття. Зверніть увагу на відмінності, які я вкажу.</p><h2 id="var"><strong>Var</strong></h2><p>До появи ES6 правили оголошення <code>var</code>. Проте є проблеми, пов’язані зі змінними, які оголошені з <code>var</code>. Ось чому виникла необхідність у появі нових способів оголошення змінних. По-перше, давайте краще зрозуміємо <code>var</code>, перед тим як обговорювати ці проблеми.</p><h3 id="-var"><strong>Область видимості var</strong></h3><p><strong>Область видимості</strong> по суті означає, де ці змінні доступні для використання. Оголошення <code>var</code> мають глобальну та локальну область/область функції.</p><p>Область є глобальною, якщо змінна <code>var</code> оголошена поза функцією. Це означає, що будь-яка змінна, оголошена з <code>var</code> поза блоком функції, доступна для використання у всьому вікні.</p><p><code>var</code> знаходиться в області функції, якщо оголошена у функції. Це означає, що до неї можна отримати доступ лише в межах цієї функції.</p><p>Щоб краще зрозуміти, подивіться на приклад нижче.</p><pre><code class="language-javascript">    var greeter = "hey hi";
    
    function newFunction() {
        var hello = "hello";
    }
</code></pre><p>У прикладі <code>greeter</code> має глобальну область видимості, оскільки існує поза функцією, тоді як <code>hello</code> має область функції. Тому ми не можемо отримати доступ до змінної <code>hello</code> поза функцією. А якщо ми зробимо так:</p><pre><code class="language-javascript">    var tester = "hey hi";
    
    function newFunction() {
        var hello = "hello";
    }
    console.log(hello); // error: hello is not defined
</code></pre><p>Ми отримаємо помилку через те, що <code>hello</code> недоступна поза функцією.</p><h3 id="-var-"><strong>Змінні var можна переголосити та оновити</strong></h3><p>Це означає, що ми можемо робити це в тій самій області та не отримаємо помилку.</p><pre><code class="language-javascript">    var greeter = "hey hi";
    var greeter = "say Hello instead";
</code></pre><p>і це</p><pre><code class="language-javascript">    var greeter = "hey hi";
    greeter = "say Hello instead";
</code></pre><h3 id="-var-1"><strong>Підняття var</strong></h3><p>Підняття — це механізм JavaScript, за допомогою якого змінні та оголошення функцій переміщуються наверх своєї області перед виконанням коду. Це означає, що якщо ми зробимо ось так:</p><pre><code class="language-javascript">    console.log(greeter);
    var greeter = "say Hello"
</code></pre><p>воно інтерпретується так:</p><pre><code class="language-javascript">    var greeter;
    console.log(greeter); // greeter is undefined
    greeter = "say Hello"
</code></pre><p>Таким чином змінні <code>var</code> підіймаються наверх своєї області та ініціалізуються значенням <code>undefined</code>.</p><h3 id="-var-2"><strong>Проблематика var</strong></h3><p>У <code>var</code> є слабке місце. Я використаю приклад нижче, щоб пояснити:</p><pre><code class="language-javascript">    var greeter = "hey hi";
    var times = 4;

    if (times &gt; 3) {
        var greeter = "say Hello instead"; 
    }
    
    console.log(greeter) // "say Hello instead"
</code></pre><p>Оскільки <code>times &gt; 3</code> повертає true, <code>greeter</code> перевизначається на <code>"say Hello instead"</code>. Це не є проблемою, якщо ви хочете, щоб <code>greeter</code> був перевизначений; але стає проблемою, коли ви не усвідомлюєте, що змінна <code>greeter</code> була визначена раніше.</p><p>Якщо ви використовували <code>greeter</code> в інших частинах свого коду, ви можете бути здивовані виводом, який можете отримати. Ймовірно, це спричинить багато помилок у коді. Ось чому <code>let</code> та <code>const</code> необхідні.</p><h2 id="let"><strong>Let</strong></h2><p>Тепер для оголошення змінної найкращим варіантом є <code>let</code>. Це не дивно, оскільки вона створена для вдосконалення оголошень <code>var</code>. Вона також розв’язує проблематику <code>var</code>, яку ми щойно розглянули. Розглянемо, чому так.</p><h3 id="let-"><strong>let має блокову область</strong></h3><p>Блок — це фрагмент коду, обмежений {}. Блок живе у фігурних дужках. Будь-що у фігурних дужках є блоком.</p><p>Отже, змінна, оголошена в блоці з <code>let</code>, доступна для використання лише в цьому блоці. Поясню на прикладі:</p><pre><code class="language-javascript">   let greeting = "say Hi";
   let times = 4;

   if (times &gt; 3) {
        let hello = "say Hello instead";
        console.log(hello); // "say Hello instead"
    }
   console.log(hello) // hello is not defined
</code></pre><p>Як бачимо, використання <code>hello</code> поза блоком (фігурні дужки) повертає помилку. Це тому, що змінні <code>let</code> мають блокову область.</p><h3 id="let--1"><strong>let можна оновити, але не переголосити</strong></h3><p>Як і <code>var</code>, змінна, оголошена з <code>let</code>, може бути оновлена в межах області видимості. На відміну від <code>var</code>, змінна <code>let</code> не може бути переголошена в межах області видимості. Це працюватиме:</p><pre><code class="language-javascript">    let greeting = "say Hi";
    greeting = "say Hello instead";
</code></pre><p>а це поверне помилку:</p><pre><code class="language-javascript">    let greeting = "say Hi";
    let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared
</code></pre><p>Однак, якщо ту саму змінну визначено в різних областях, помилки не буде:</p><pre><code class="language-javascript">    let greeting = "say Hi";
    if (true) {
        let greeting = "say Hello instead";
        console.log(greeting); // "say Hello instead"
    }
    console.log(greeting); // "say Hi"
</code></pre><p>Чому немає помилки? Це тому, що обидва випадки розглядаються як різні змінні, оскільки вони мають різні області.</p><p>З цього погляду, <code>let</code> краща за <code>var</code>. Використовуючи <code>let</code>, вам не потрібно турбуватися, чи ви використали ім’я для змінної раніше, оскільки змінна існує лише в межах області видимості.</p><p>Крім того, оскільки змінна не може бути оголошена більше одного разу в межах області видимості, то проблеми, яка виникає з <code>var</code>, не виникає.</p><h3 id="-let"><strong>Підняття let</strong></h3><p>Подібно до <code>var</code>, оголошення <code>let</code> підіймаються наверх. На відміну від <code>var</code>, яке ініціалізується як <code>undefined</code>, ключове слово <code>let</code> не ініціалізується. Тому якщо ви спробуєте використати змінну <code>let</code> перед оголошенням, ви отримаєте <code>Reference Error</code>.</p><h2 id="const"><strong>Const</strong></h2><p>Змінні, оголошені з <code>const</code>, зберігають постійні значення. Оголошення <code>const</code> має деяку схожість з оголошенням <code>let</code>. &nbsp; &nbsp;</p><h3 id="-const-"><strong>Оголошення const мають блокову область</strong></h3><p>Як і до оголошень <code>let</code>, до оголошень <code>const</code> можна отримати доступ лише в межах блоку, у якому вони були оголошені.</p><h3 id="const-"><strong>Const не можна оновити або переголосити</strong></h3><p>Це означає, що значення змінної, оголошеної з <code>const</code>, залишається таким самим у межах області видимості. Його не можна оновити чи переголосити. Тому якщо ми оголосимо змінну з <code>const</code>, ми не зможемо зробити так:</p><pre><code class="language-javascript">    const greeting = "say Hi";
    greeting = "say Hello instead";// error: Assignment to constant variable. 
</code></pre><p>чи так:</p><pre><code class="language-javascript">    const greeting = "say Hi";
    const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared
</code></pre><p>Тому кожне оголошення <code>const</code> повинне бути ініціалізоване під час оголошення. </p><p>Ця поведінка дещо відрізняється, коли йдеться про об’єкти, оголошені з <code>const</code>. Хоча об’єкт <code>const</code> неможливо оновити, можна оновити його властивості. Отже, якщо ми оголосимо об’єкт <code>const</code> ось так:</p><pre><code class="language-javascript">    const greeting = {
        message: "say Hi",
        times: 4
    }
</code></pre><p>але не можемо ось так:</p><pre><code class="language-javascript">    greeting = {
        words: "Hello",
        number: "five"
    } // error: Assignment to constant variable.
</code></pre><p>ми зможемо зробити ось так:</p><pre><code class="language-javascript">    greeting.message = "say Hello instead";
</code></pre><p>Це оновить значення <code>greeting.message</code> без повернення помилок.</p><h3 id="-const"><strong>Підняття const</strong></h3><p>Подібно до <code>let</code>, оголошення <code>const</code> підіймаються наверх, але не ініціалізуються.</p><p>Тож на випадок, якщо ви пропустили відмінності, ось вони:</p><ul><li>Оголошення <code>var</code> мають глобальну область видимості або область функції, тоді як <code>let</code> і <code>const</code> мають блокову область видимості.</li><li>Змінні <code>var</code> можна оновити та переголосити в межах їхньої області; змінні <code>let</code> можна оновити, але не переголосити; змінні <code>const</code> не можна ні оновити, ні переголосити.</li><li>Усі вони підіймаються наверх своєї області. Але тоді як змінні <code>var</code> ініціалізуються з <code>undefined</code>, змінні <code>let</code> і <code>const</code> не ініціалізуються.</li><li>Хоча <code>var</code> і <code>let</code> можуть бути оголошені без ініціалізації, <code>const</code> повинна бути ініціалізована під час оголошення.</li></ul><p>Маєте запитання чи доповнення? Будь ласка, дайте мені знати.</p><p>Дякую, що прочитали :)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Три способи перевернути рядок у JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Ця публікація базується на основах написання алгоритмів від freeCodeCamp « Зворотний рядок [https://www.freecodecamp.org/ukrainian/learn/javascript-algorithms-and-data-structures/basic-algorithm-scripting/reverse-a-string] » Перевертання рядка є одним із найпоширеніших запитань по JavaScript на співбесіді. Інтерв’юери можуть попросити вас написати різні способи перевернути рядок, іноді без використання вбудованих методів, або навіть за допомогою рекурсії. Існують десятки різних способів переве ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/try-sposoby-perevernuty-ryadok-u-javascript/</link>
                <guid isPermaLink="false">63091ce9a402f907381bffdf</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ rustamdocstranslator ]]>
                </dc:creator>
                <pubDate>Mon, 19 Sep 2022 17:34:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2022/08/E74F9642-6E20-4DDA-8618-1B55FE6BFDC9.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/how-to-reverse-a-string-in-javascript-in-3-different-ways-75e4763c68cb/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Three Ways to Reverse a String in JavaScript</a>
      </p><p><em>Ця публікація базується на основах написання алгоритмів від freeCodeCamp «<a href="https://www.freecodecamp.org/ukrainian/learn/javascript-algorithms-and-data-structures/basic-algorithm-scripting/reverse-a-string">Зворотний рядок</a>»</em></p><p><strong>Перевертання рядка</strong> є одним із найпоширеніших запитань по JavaScript на співбесіді. Інтерв’юери можуть попросити вас написати різні способи перевернути рядок, іноді без використання вбудованих методів, або навіть за допомогою рекурсії.</p><p>Існують десятки різних способів перевернути рядок, за винятком вбудованої функції <strong>reverse</strong>, оскільки її немає в JavaScript.</p><p>Нижче наведено три найцікавіші способи перевертання рядка в JavaScript.</p><h4 id="-"><strong>Завдання</strong></h4><blockquote>Переверніть заданий рядок.<br>За необхідності перетворіть рядок у масив до того, як вносити зміни.<br>У результаті ви повинні отримати рядок.</blockquote><pre><code class="language-js">function reverseString(str) {
    return str;
}
reverseString("hello");</code></pre><h4 id="--1">Надані випадки</h4><ul><li><strong><em>reverseString(“hello”)</em></strong> повинен перетворитися на «olleh»</li><li><strong><em>reverseString(“Howdy”)</em></strong> повинен перетворитися на «ydwoH»</li><li><strong><em>reverseString(“Greetings from Earth”)</em></strong> повинен перетворитися на «htraE morf sgniteerG»</li></ul><h3 id="1-">1. Перевертання рядка за допомогою вбудованих функцій</h3><p>Для цього способу ми будемо використовувати три методи: String.prototype.split(), Array.prototype.reverse() та Array.prototype.join().</p><ul><li>Метод split() розбиває рядок в масив рядків, поділяючи рядок на підрядки.</li><li>Метод reverse() повертає масив на місці. Перший елемент масиву стає останнім, а останній — першим.</li><li>Метод join() об’єднує всі елементи масиву в рядок.</li></ul><pre><code class="language-js">function reverseString(str) {
    // Крок 1. Використайте метод split(), щоб повернути новий масив
    var splitString = str.split(""); // var splitString = "hello".split("");
    // ["h", "e", "l", "l", "o"]
 
    // Крок 2. Використайте метод reverse(), щоб перевернути новий створений масив
    var reverseArray = splitString.reverse(); // var reverseArray = ["h", "e", "l", "l", "o"].reverse();
    // ["o", "l", "l", "e", "h"]
 
    // Крок 3. Використайте метод join(), щоб об’єднати всі елементи масиву в рядок
    var joinArray = reverseArray.join(""); // var joinArray = ["o", "l", "l", "e", "h"].join("");
    // "olleh"
    
    //Крок 4. Поверніть перевернутий рядок
    return joinArray; // "olleh"
}
 
reverseString("hello");</code></pre><h4 id="--2">Сполучаємо три методи:</h4><pre><code>function reverseString(str) {
    return str.split("").reverse().join("");
}
reverseString("hello");</code></pre><h3 id="2-for-">2. Перевертання рядка за допомогою циклу for, що зменшується</h3><pre><code class="language-js">function reverseString(str) {
    // Крок 1. Створіть порожній рядок, у якому буде розміщено новий створений рядок
    var newString = "";
 
    // Крок 2. Створіть цикл FOR
    /* Початковою точкою циклу буде (str.length - 1), що відповідає 
        останньому символу рядка, "o"
       Поки «i» більше або дорівнює 0, цикл триватиме
       Ми зменшуємо «i» після кожної ітерації */
    for (var i = str.length - 1; i &gt;= 0; i--) { 
        newString += str[i]; // або newString = newString + str[i];
    }
    /* Довжина hello дорівнює 5
        Для кожної ітерації: i = str.length - 1 та newString = newString + str[i]
        Перша ітерація:    i = 5 - 1 = 4,         newString = "" + "o" = "o"
        Друга ітерація:   i = 4 - 1 = 3,         newString = "o" + "l" = "ol"
        Третя ітерація:    i = 3 - 1 = 2,         newString = "ol" + "l" = "oll"
        Четверта ітерація:   i = 2 - 1 = 1,         newString = "oll" + "e" = "olle"
        П'ята ітерація:    i = 1 - 1 = 0,         newString = "olle" + "h" = "olleh"
    Кінець циклу FOR*/
 
    // Крок 3. Поверніть перевернутий рядок
    return newString; // "olleh"
}
 
reverseString('hello');</code></pre><h4 id="--3">Без коментарів:</h4><pre><code class="language-js">function reverseString(str) {
    var newString = "";
    for (var i = str.length - 1; i &gt;= 0; i--) {
        newString += str[i];
    }
    return newString;
}
reverseString('hello');</code></pre><h3 id="3-">3. Перевертання рядка за допомогою рекурсії</h3><p>Для цього способу ми будемо використовувати два методи: String.prototype.substr() та String.prototype.charAt().</p><ul><li>Метод substr() повертає символи в рядку, починаючи з вказаного місця, через вказану кількість символів.</li></ul><pre><code>"hello".substr(1); // "ello"</code></pre><ul><li>Метод charAt() повертає вказаний символ із рядка.</li></ul><pre><code>"hello".charAt(0); // "h"</code></pre><p>Глибина рекурсії дорівнює довжині рядка. Цей метод не найкращий та дуже повільний, якщо рядок довгий і розмір стека викликає серйозне занепокоєння.</p><pre><code class="language-js">function reverseString(str) {
  if (str === "") // Це кінцевий випадок, який закінчить рекурсію
    return "";
  
  else
    return reverseString(str.substr(1)) + str.charAt(0);
/* 
Перша частина методу рекурсії
Потрібно пам’ятати, що у вас буде не один, а декілька вкладених викликів

Кожен виклик: str === "?"        	                  reverseString(str.subst(1))     + str.charAt(0)
1-ий виклик – reverseString("Hello")   поверне   reverseString("ello")           + "h"
2-ий виклик – reverseString("ello")    поверне   reverseString("llo")            + "e"
3-ій виклик – reverseString("llo")     поверне   reverseString("lo")             + "l"
4-ий виклик – reverseString("lo")      поверне   reverseString("o")              + "l"
5-ий виклик – reverseString("o")       поверне   reverseString("")               + "o"

Друга частина методу рекурсії
Метод потрапляє в умову if (якщо), і виклик з найбільшим вкладенням повертається негайно

5-ий виклик поверне reverseString("") + "o" = "o"
4-ий виклик поверне reverseString("o") + "l" = "o" + "l"
3-ій виклик поверне reverseString("lo") + "l" = "o" + "l" + "l"
2-ий виклик поверне reverserString("llo") + "e" = "o" + "l" + "l" + "e"
1-ий виклик поверне reverserString("ello") + "h" = "o" + "l" + "l" + "e" + "h" 
*/
}
reverseString("hello");</code></pre><h4 id="--4">Без коментарів:</h4><pre><code>function reverseString(str) {
  if (str === "")
    return "";
  else
    return reverseString(str.substr(1)) + str.charAt(0);
}
reverseString("hello");</code></pre><h4 id="--5">Умовний (тернарний) оператор:</h4><pre><code class="language-js">function reverseString(str) {
  return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString("hello");</code></pre><p><strong>Перевертання рядка в JavaScript</strong> — це невеликий та простий алгоритм, який можуть запитати під час співбесіди. Ви можете вибрати короткий шлях у розв’язанні цієї проблеми або розв’язати її за допомогою рекурсії чи інших складніших рішень.</p><p>Сподіваюся, ви знайшли це корисним. Це частина моєї серії публікацій «Як розв’язувати алгоритми fCC», що стосується завдань по алгоритмах від freeCodeCamp, де я пропоную декілька розв’язків та покроково пояснюю, що може здатись неочевидним.</p><p>Ви можете слідкувати за мною на <a href="https://medium.com/@sonya.moisset" rel="noopener"><strong>Medium</strong></a><strong>, <a href="https://twitter.com/SonyaMoisset" rel="noopener">Twitter</a>, <a href="https://github.com/SonyaMoisset" rel="noopener">Github</a></strong> та <a href="https://www.linkedin.com/in/sonyamoisset" rel="noopener"><strong>LinkedIn</strong></a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
