Перейти до вмісту
    Без категорії / Технічний розбір для розробників

    Технічний розбір для розробників

    Оцініть цю публікацію!
    [Усього: 0 Середнє значення: 0]

    5 Сучасних JavaScript Фіч, Які Зроблять Твій Код Кращим (ES2024 & Beyond)

    Сучасний JavaScript постійно еволюціонує, пропонуючи розробникам потужні інструменти для створення ефективного та читабельного коду. Багато з цих нових фіч залишаються недооціненими, навіть серед досвідчених розробників. У цій статті ми розглянемо 5 таких можливостей, які можуть суттєво покращити твою продуктивність та якість коду, особливо в контексті асинхронних операцій, оптимізації та маніпуляцій з DOM.

    Контекст і чому це важливо

    У багатьох проєктах, особливо у великих веб-додатках, ми стикаємося з кодом, який важко підтримувати та розуміти. Часто це пов’язано з використанням застарілих підходів, неоптимізованих асинхронних операцій або нерозумним маніпулюванням DOM. Наприклад, копіювання логіки обробки помилок у кожному `async` блоці, або неоптимальне використання циклів для оновлення DOM – це типові приклади проблем, які можна вирішити за допомогою сучасних JavaScript фіч. За даними Stack Overflow Developer Survey 2024, JavaScript залишається найпопулярнішою мовою програмування, але багато розробників не використовують останні можливості, що призводить до менш ефективного коду.

    Практична реалізація: Logical Assignment Operators

    Logical assignment operators (??=, ||=, &=) дозволяють поєднувати операції присвоєння з логічними операторами. Це робить код більш компактним та читабельним, особливо при роботі з дефолтними значеннями та умовним присвоєнням.

    
    // Приклад використання ??=
    let username = process.env.USERNAME;
    username ??= 'guest'; // Присвоює 'guest', якщо process.env.USERNAME не визначено
    
    // Приклад використання ||=
    let isLoading = false;
    isLoading ||= true; // Присвоює true, якщо isLoading не true
    
    // Приклад використання &=
    let userRole = 'user';
    userRole &= 'admin'; // Присвоює 'user' якщо 'admin' не має значення
    console.log(userRole); // Виведе 'user'
    

    Цей код дозволяє уникнути більш багатослівних конструкцій, таких як `if (username === undefined) { username = ‘guest’; }`. Використання logical assignment operators робить код більш лаконічним та легким для розуміння, особливо при роботі з великою кількістю змінних та умов.

    Поширені помилки та підводні камені

    • Неправильне розуміння пріоритету операторів: Неправильне використання може призвести до неочікуваних результатів. Завжди перевіряйте пріоритет операторів та використовуйте дужки для явного визначення порядку виконання.
      • Забуття про nullish coalescing operator (??): Використовуйте `??` замість `||` для більш точної перевірки на null або undefined, щоб уникнути неочікуваних присвоювань, якщо змінна має falsy значення, наприклад 0 або “”.
    • Неефективне використання в циклах: Уникайте використання logical assignment operators всередині циклів, якщо це не потрібно, оскільки це може вплинути на продуктивність.

    Порівняння підходів

    Раніше, для присвоєння дефолтних значень, ми використовували `if` оператори або тернарні оператори. Logical assignment operators надають більш стислий та читабельний спосіб досягнення того ж результату, зменшуючи кількість коду та покращуючи його підтримку. Однак, важливо розуміти їхню поведінку та пріоритет, щоб уникнути помилок.

    Висновки

    Logical assignment operators – це не просто синтаксичний цукор, це інструмент, який може значно покращити читабельність та лаконічність твого JavaScript коду. Почніть використовувати їх у своїх проєктах вже сьогодні, і ти помітиш, як вони спрощують твою роботу. Експериментуйте з ними, щоб повністю зрозуміти їхню поведінку та потенціал.

    Практична реалізація: Private Class Fields (#)

    Private class fields дозволяють створювати приватні властивості та методи в класах, що покращує інкапсуляцію та захищає внутрішню логіку класу від випадкового доступу ззовні. Це особливо корисно у великих проєктах, де важлива чітка структура та контроль доступу до даних.

    
    class MyClass {
      #privateProperty;
    
      constructor(value) {
        this.#privateProperty = value;
      }
    
      #privateMethod() {
        console.log('This is a private method.');
      }
    
      getProperty() {
        this.#privateMethod();
        return this.#privateProperty;
      }
    }
    
    const myInstance = new MyClass('secret');
    console.log(myInstance.getProperty()); // Виведе: "This is a private method." та "secret"
    // console.log(myInstance.#privateProperty); // Помилка: Private field '#privateProperty' must be accessed directly from within the class body.
    

    Зауваж, що спроба отримати доступ до `#privateProperty` безпосередньо ззовні класу призведе до помилки. Це забезпечує надійний захист внутрішніх даних та методів класу.

    Практична реалізація: Error Boundaries (React)

    Error boundaries дозволяють перехоплювати помилки в React компонентах, запобігаючи “падінню” всього додатку. Це критично важливо для забезпечення стабільності та зручності користування веб-додатком. Error boundaries дозволяють “врятувати” частину додатку, навіть якщо в одному з компонентів виникає помилка.

    
    class ErrorBoundary extends React.Component {
      constructor(props) {
        super(props);
        this.state = { hasError: false };
      }
    
      static getDerivedStateFromError(error) {
        return { hasError: true };
      }
    
      render() {
        if (this.state.hasError) {
          return 

    Something went wrong.

    ; } return this.props.children; } } function MyComponent() { throw new Error('This is a test error.'); return
    My Component
    ; } function App() { return (
    ); }

    В цьому прикладі, `ErrorBoundary` перехопить помилку, кинуту `MyComponent`, та відобразить повідомлення про помилку, замість того, щоб весь додаток перестав працювати.

    Практична реалізація: Top-Level Await

    Top-level await дозволяє використовувати `await` поза функціями, наприклад, у модулях JavaScript. Це спрощує асинхронний код та робить його більш читабельним, особливо при імпорту даних або налаштуванні додатку.

    
    // myModule.js
    import fetch from 'node-fetch';
    
    const data = await fetch('https://api.example.com/data').then(res => res.json());
    
    export default data;
    
    // app.js
    import data from './myModule.js';
    
    console.log(data);
    

    В цьому прикладі `await` використовується безпосередньо в модулі `myModule.js`, що дозволяє асинхронно отримати дані та експортувати їх. Це спрощує структуру коду та робить його більш зрозумілим.

    Практична реалізація: Array FindLast

    Метод `findLast()` надає можливість

    Залишити відповідь

    Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *