10 189 subscribers

5 самых полезных приемов в JavaScript

114 full reads
5 самых полезных приемов в JavaScript

Источник: Nuances of Programming

В это трудно поверить, но я пишу код на JavaScript вот уже почти три года. Думаю, что могу говорить на эту тему с позиции эксперта.

Итак, какие приемы я использую чаще всего (то есть ежедневно), о которых вы, возможно, не знаете? Если вы уже хорошо разбираетесь в JavaScript, вы наверняка все это умеете.

Перейдем к первому приему.

1. Селектор запросов

Допустим, у вас есть веб-страница, и вам нужно выбрать какой-то элемент. Вы, вероятно, знаете, что можете получить нужный элемент через API Dom, используя функцию get element by class name или get element by ID. Но есть и другой путь. Можно не заморачиваться, а просто использовать селектор jQuery, который работает как селектор CSS, где вы ставите точку для класса и хештег для ID.

Скриншот автора
Скриншот автора

А теперь лайфхак, о котором вы наверняка не знали. Вы также можете выбирать субэлементы с помощью селектора jQuery. Этот прием используется по отношению к имени или идентификатору класса. Таким образом, вы можете использовать индекс каретки для получения всех дочерних элементов или синтаксис с пробелами только для получения прямого дочернего элемента и селектора запросов вариантов. Данный способ находит все совпадения и возвращает массив заметок.

2. Методы массива

Итак, какие методы массива перехвалены, а какие, наоборот, недооценены? То, что я собираюсь сказать, может показаться кому-то спорным. Есть функция forEach, которая действительно переоценена. С другой стороны, есть функция reduce, которая не слишком высоко котируется у многих разработчиков, особенно среди новичков.

Думаю, такое отношение к reduce бытует потому, что люди не так часто используют эту функцию и не понимают, каким потенциалом она обладает.

С помощью reduce вы получаете аккумулятор и значение для callback-функции. Дело в том, что аккумулятор не обязательно должен представлять собой число. Вы инициализируете аккумулятор и при этом можете сделать его чем угодно: объектом, строкой, массивом и, конечно же, числом.

Скриншот автора
Скриншот автора

Это позволяет легко конвертировать массивы в хэш-карты или объекты. Вы можете создавать строки и различные варианты массива, либо расширяя его, либо уменьшая его размер и т. д. Функция reduce настолько многофункциональна, что даже выполняет роль сортировщика и фильтровальщика карт (при условии корректного прописания callback-функции).

Скриншот автора
Скриншот автора

3. Применение деструктуризации

Это одна из лучших особенностей JavaScript, во многих других языках подобного нет.

Вы можете извлечь одно или несколько свойств из объекта или массива. Это широко практикуется в таких фреймворках, как Angular и React. Каждый раз, когда вы импортируете библиотеки, вы уже наверняка знаете, какой базовый объект структурируете, извлекая одно значение в переменную. Но вы также можете использовать деструктуризацию в качестве аргумента функции!

Ладно, думаю, этот прием вам тоже знаком. А знали ли вы, что вы можете выполнять вложенную деструктуризацию, проходя несколько слоев вглубь объекта?

Скриншот автора
Скриншот автора

Еще один классный прием заключается в том, что вы можете выполнять деструктуризацию непосредственно после написания метода массива. Например, если вы сортируете массив и хотите вытащить первый элемент, вы можете сделать это следующим образом:

Скриншот автора
Скриншот автора

4. Советы по объекту Promise

Объекты промис характеризуются асинхронностью, поскольку они выполняются в фоновом режиме относительно кода, который вы видите здесь.

Лучшим примером является использование метода fetch для извлечения некоторых данных из URL-адреса. Зачастую в таких случаях нужно выполнять несколько запросов или промисов. Допустим, вам нужны данные из трех разных URL-адресов.

Самое интересное в промисах то, что вы можете обращаться с ними как с любыми другими объектами и хранить их в структурах данных.

Итак, у вас есть URL-адреса в массиве и вы хотите добыть промис от каждого из них. Используем функцию map и получаем массив промисов.

Скриншот автора
Скриншот автора

Теперь вопрос в следующем. Когда у нас есть несколько промисов, хотим ли мы, чтобы они выполнялись одновременно или один за другим? Вот тут-то и пригодится этот прием.

Запустить их одновременно очень просто, если вы используете функцию all, которая на самом деле будет блокирующей строкой. Поэтому будет наблюдаться ожидание завершения этой строки.

Прежде чем продолжать работу, эта функция выдаст массив результатов. Некоторые из них могут быть ошибочными. Таким образом, данный прием обрабатывает ошибки за вас. Это реально мощная функция.

Скриншот автора
Скриншот автора

Если вы хотите запустить промисы один за другим, будьте осторожны. Вы можете использовать async/await, но помните, что await должны быть внутри функции async.

Просто дополнительно напишите ключевое слово async или определение функции. Уверен: именно на этом этапе возникает большое количество багов. Дело в том, что вы не можете запустить await в рамках метода массивов.

Если вы попытаетесь создать объект map, а затем запустите await внутри map или цикл for each, это не сработает. Вам нужно написать цикл for или for of, и только в этой структуре ключевое слово await будет работать при циклировании в массиве. Так что будьте осторожны.

Скриншот автора
Скриншот автора
Скриншот автора
Скриншот автора

5. Обработка ошибок

Признаюсь, мне не сразу удалось понять принцип этого приема. Каждый раз, когда возникает ошибка, ее нужно перехватить, иначе ваша программа выйдет из строя. А ведь вы этого меньше всего хотите во время работы.

Поэтому вам будет полезно знать, что такое блоки catch. Если в блоке try или, что еще критичнее, в любой области ниже возникает ошибка, блок try вызывает функцию, которая будет включена в этот блок.

Скриншот автора
Скриншот автора

Блок catch  —  это место, где вы обрабатываете ошибки. У вас появляется ошибка в объекте ошибки, и тогда вы можете либо распечатать ее, либо сделать с ней что-то другое. Вы, вероятно, также знаете, как работает catch в контексте промисов. Как правило, у вас есть цепочка then с блоком catch в самом конце для поимки любых ошибок, которые могут произойти.

Скриншот автора
Скриншот автора

Выглядит жутковато. Но пятый прием поможет все это подчистить. Если использовать один await в этом коде, то можно либо “забросить” await в блок try-catch, либо поместить catch в конец синтаксиса await.

Скриншот автора
Скриншот автора

Как видите, теперь все выглядит намного чище, чем до этого. Это реально круто. Получается, мы объединили традиционный синтаксис промиса с async/await.

Вот и все мои пять приемов, которые я хотел вам сегодня показать. Я не стал вас “грузить” слишком заумными трюками, чтобы не шокировать вас или ваших коллег. Как я уже сказал, это наиболее часто используемые приемы в JavaScript. Если вы разработчик JavaScript, вам придется иметь с ними дело каждый день.

Надеюсь, вы научились чему-то новому. Спасибо за внимание!

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи: ishak boutana: The 5 Most Useful JavaScript Tricks