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

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

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

Наслаждаться! 😁

1. Стрелочные функции

Первый прием Javascript в этом списке — стрелочные функции.

Стрелочные функции были представлены в ES6 и представляют собой классную возможность избавиться от ключевого слова function.

Давайте посмотрим на обычную функцию JavaScript старой школы.

function simpleFunction() {
 return 'hello'
}

А теперь давайте сравним это со стрелочной функцией, которая делает то же самое.

const simpleFunction = () => 'hello'

Как видите, с помощью стрелочных функций можно сэкономить много ненужных строк кода.

2. Условный оператор

Условный оператор — это полезный трюк javascript, который можно использовать, чтобы избежать операторов if.

Многие (вложенные) операторы if считаются плохой практикой и ухудшают читабельность вашего кода. Помните, что хорошая читабельность экономит ваше время и деньги.

Давайте посмотрим на пример.

result = isNumber ? 2 : 'Hello';

А теперь давайте посмотрим, как можно написать тот же код с операторами if.

if(isNumber) {
  result = 2;   
}else {
    result = 'Hello';
}

3. Оператор спреда

Это моя любимая функция версии Javascript для ES6. Это также один из самых крутых трюков с Javascript.

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

Например, для копирования массивов.

const array = [1, 2, 3];
const copy = [...array];

Без оператора распространения это можно было бы сделать так. На мой взгляд, спред-решение намного красивее!

const array = [1, 2, 3];
const copy1 = [].concat(array);
const copy2 = Array.from(array);

Как вы могли видеть в этом примере с массивом, мы не будем сохранять строки. Но мы получим более эстетичный код.

Но есть и другой, гораздо более крутой вариант использования операторов распространения: назначение объектам!

const foo = { message: 'hello', value: 2 };
const fooBye = {...foo, message: 'bye' };

В этом примере создается копия объекта foo и даже присваивается новое значение свойству «msg», перезаписывая ранее скопированное.

И все это в одной строке без использования Object.assign().

4. Деструктурирование объектов

Взгляните на этот объект.

const foo = {
    test: {
        veryVeryLongKey: {
            value1: 1;
            value2: 2;
        }
    }
}

Представьте, что мы хотим получить доступ к value1 и value2 несколько раз в одной и той же области.

Это будет выглядеть как беспорядок:

const calculation = (foo.test.veryVeryLongKey.value1 + foo.test.veryVeryLongKey.valu2) * foo.test.veryVeryLongKey.value2;

Далее мы будем использовать деструктуризацию объекта, чтобы немного очистить это:

const { value1 , value2 } = foo.test.veryVeryLongKey;
const calculation = (value1 + value2) * value2;

Опять же, мы не сохраняем ни одной строки, но резко повышаем читаемость кода. Что опять же экономит ваше время и деньги.

5. Асинхронный / Ожидание

С относительно новыми ключевыми словами async и await вы можете избавиться от традиционного синтаксиса промисов для асинхронного кода.

Давайте сначала определим обещание, которое будет использоваться в обоих следующих примерах.

const promise = new Promise((resolve, reject) => {
     // Wait for 1 second and then resolve the promise
     setTimeout(() => resolve('hello'), 1000);
     if(somethingHappened){
         reject('Something went wrong!');
     }
 })

Теперь мы определили обещание, которое будет ждать 1 секунду и выполнять обещание. Если что-то пойдет не так в течение этого периода, оно будет отклонено.

Давайте посмотрим, как бы мы справились с этим обещанием традиционным способом.

function printHelloAsync() {
    promise.then((success) => {
         console.log(success);
     }).catch((error) => {
         console.log(error);
     });
}

Как видите, для традиционного пути нам потребовалось довольно много строк и вложенного кода.

Теперь давайте попробуем добиться того же результата, используя await.

function printHelloAsync() {     
 console.log(await promise);
}

6. Встроенные неопределенные проверки

Прежде чем вы сможете безопасно использовать свойства объекта, не рискуя досадными ошибками, вы должны проверить их на «неопределенность».

Вы можете обернуть код, который обращается к свойству, в оператор if, например:

const foo = {
    message: undefined;
}

if(foo.message) {
  console.log(foo.message);   
}

Или вы можете добиться того же с помощью логического оператора и и выполнить встроенную проверку undefined:

foo.message && console.log(foo.message);

7. для в, для из

Стандартные циклы for и while — не единственные способы перебора коллекций.

Вот как выглядит обычный цикл for в Javascript.

// Regular for loop to iterate over an array
for(let i = 0; i<array.length; i++){
 const item = array[i];
 console.log('Item: ' + item);
}

// Regular for loop to iterate over the properties of an object
const keys = Object.keys(foo);
for(let i = 0; i < keys.length; i++){
  const key = keys[i];
  console.log('Key: ' + key);
}

Существуют также циклы for of и for in, которые являются очень полезными приемами javascript для различных случаев использования.

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

  • for of — используется для перебора элементов массива.
  • for in — используется для перебора ключей объекта.

Приведенный выше пример итерации массива можно легко заменить циклом for of.

for(let item of array){
     console.log('Item: ' + item);
}

Для циклов избегайте использования индекса (который используется в обычных циклах). Это может помочь улучшить читаемость.

И теперь, наконец, я покажу вам цикл for in. Итерация по свойствам объекта с циклом for in может быть выполнена следующим образом:

for(let key in foo) {
  console.log('Key: ' + key);   
}

Таким образом, оба варианта цикла для in и for of очень полезны, чтобы избавить вас от ненужных проблем с индексами и улучшить читаемость вашего кода.

8. Один из очевидных приемов Javascript — использование функций

С помощью функций вы можете и определенно должны инкапсулировать общий код.

Представьте, что у вас есть один и тот же код, написанный в двух разных местах вашего проекта.

Это время, когда вы должны передать этот код в функцию, которую затем можно будет вызывать из любого места.

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

9. Используйте параметры по умолчанию в функциях

Этот трюк с JS тоже очень очевиден. Параметры функции по умолчанию — отличный способ избежать уродливых проверок if в каждой вашей функции.

Позвольте мне продемонстрировать это. Сначала я покажу вам функцию без параметров по умолчанию.

function(a, b) {
    if(!a){
        a = 5;
    }
    if(!b){
        b = 3;
    }
    console.log(a+b);   
}

Большая часть кода этой функции только проверяет параметры.

Этого можно избежать с помощью параметров по умолчанию.

function(a=5, b=3){
    console.log(a+b);
}

Очень полезно, не так ли? 😃

10. Не изобретайте велосипед

Это не особый трюк с javascript, поскольку он применим к разработке программного обеспечения в целом.

Есть большая вероятность, что какой-то другой разработчик уже решил вашу проблему и что на Github или NPM есть библиотека, которую вы можете свободно использовать в своем проекте.

При использовании сторонних библиотек вы можете сэкономить огромное количество времени на разработку.

Выбирать библиотеку следует очень осторожно, поскольку она может содержать ошибки или проблемы с безопасностью.

Следующие цифры могут быть хорошими индикаторами того, безопасно ли использовать стороннюю библиотеку:

  • Звезды/загрузки за неделю — эти цифры показывают, насколько популярна библиотека.
  • Проблемы/запросы на вытягивание. Эти цифры являются хорошим индикатором состояния разработки библиотеки. Чем выше, тем лучше. Большое количество проблем также может означать, что в нем много ошибок. с