20 сокращений JavaScript, которые сэкономят ваше время

В любом языке программирования сокращения помогают написать более чистый и оптимизированный код и выполнить задачи, использовав кротчайший синтаксис. Разберём способы сокращения в JavaScript.

1. Объявление переменных

// Обычная запись
let x; 
let y = 20;

// Короткая запись 
let x, y = 20;

2. Множественное объявление переменных

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

// Обычная запись
let a, b, c; 
a = 5; 
b = 8; 
c = 12;

// Короткая запись 
let [a, b, c] = [5, 8, 12];

3. Тернарный оператор

С помощью тернарного (условного) оператора можно сэкономить 5 строк в коде.

// Обычная запись
let marks = 26; 
let result; 
if (marks >= 30){
    result = 'Pass'; 
}
else{ 
    result = 'Fail'; 
}

// Короткая запись 
let result = marks >= 30 ? 'Pass' : 'Fail';

4. Присваивание значения по умолчанию

Используя оценку короткого замыкания OR(||), можно задать переменной значение по умолчанию в случае, когда ожидаемое значение  —  false.

// Обычная запись
let imagePath; 
let path = getImagePath(); 
if (path !== null && path !== undefined && path !== ''){ 
    imagePath = path; 
}
else{ 
    imagePath = 'default.jpg'; 
} 

// Короткая запись 
let imagePath = getImagePath() || 'default.jpg';

5. Оценка короткого замыкания AND(&&)

Если функция вызывается только с переменной со значением true, то можно применить оценку короткого замыкания AND(&&) как альтернативный вариант.

// Обычная запись
if (isLoggedin){
    goToHomepage(); 
}

// Короткая запись 
isLoggedin && goToHomepage();

При отрисовке компонентов по условию в React использовать оценку короткого замыкания AND(&&) еще удобнее. Например:

<div> { this.state.isLoading && <Loading /> } </div>

6. Смена значения двух переменных

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

let x = 'Hello', y = 55; 

// Обычная запись 
const temp = x; 
x = y; 
y = temp; 

// Короткая запись 
[x, y] = [y, x];

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

// Обычная запись 
function add(num1, num2){ 
    return num1 + num2; 
} 
// Короткая запись 
const add = (num1, num2) => num1 + num2;

Здесь можно найти более подробную информацию о стрелочных функциях.

8. Шаблонные литералы

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

// Обычная запись
console.log('You got a missed call from ' + number + ' at ' + time);

// Короткая запись
console.log(`You got a missed call from ${number} at ${time}`);

9. Многострочная строка (String)

Как правило, для многострочной записи мы применяем оператор плюс + вместе с символом перехода на новую строку \n. Но еще проще будет  —  использовать обратные кавычки `.

// Обычная запись 
console.log('JavaScript, often abbreviated as JS, is a\n' +             'programming language that conforms to the \n' + 
'ECMAScript specification. JavaScript is high-level,\n' + 
'often just-in-time compiled, and multi-paradigm.');

// Короткая запись
console.log(`JavaScript, often abbreviated as JS, is a programming language that conforms to the ECMAScript specification. JavaScript is high-level, often just-in-time compiled, and multi-paradigm.`);

10. Проверка нескольких условий

Для сопоставления нескольких условий можно записать их все в массив и использовать метод indexOf() или includes().

// Обычная запись
if(value === 1 || value === 'one' || value === 2 || value === 'two'){ 
     // выполнить код
} 
// Короткая запись №1
if([1, 'one', 2, 'two'].indexOf(value) >= 0){ 
    // выполнить код
}
// Короткая запись №2
if([1, 'one', 2, 'two'].includes(value)){ 
    // выполнить код 
}

11. Присвоение значения свойству объекта

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

let firstname = 'Amitav'; 
let lastname = 'Mishra'; 

// Обычная запись
let obj = {firstname: firstname, lastname: lastname};

// Короткая запись
let obj = {firstname, lastname};

12. Преобразование строки в число

Для преобразования строки в число существуют такие методы, как parseInt и parseFloat. Однако для этого можно также использовать унарный оператор +, поставив его перед значением строки.

// Обычная запись 
let total = parseInt('453'); 
let average = parseFloat('42.6');

// Короткая запись
let total = +'453'; 
let average = +'42.6';

13. Многократное повторение строки

Если вам нужно повторить строку определённое количество раз, можно применить цикл for. Но с помощью метода repeat() можно сделать это в одну строку.

// Обычная запись
let str = ''; 
for(let i = 0; i < 5; i ++){ 
    str += 'Hello '; 
} 
console.log(str); // Привет Привет Привет Привет Привет

// Короткая запись
'Hello '.repeat(5);

Совет: Хотите попросить у кого-нибудь прощение, написав «извини» 100 раз? Попробуйте метод repeat(). А если вам нужно, чтобы каждый повтор был на новой строке, добавьте \n к строке.

‘sorry\n’.repeat(100);

14. Возведение в степень

Чтобы найти степень какого-либо числа, можно применить метод Math.pow(). Или использовать синтаксис покороче, применив двойные звездочки **.

// Обычная запись 
const power = Math.pow(4, 3); // 64

// Короткая запись 
const power = 4**3; // 64

15. Двойное побитовое отрицание (~~)

С помощью двойного побитового отрицания можно заменить метод Math.floor().

// Обычная запись
const floor = Math.floor(6.8); // 6

// Короткая запись
const floor = ~~6.8; // 6

Примечание: Способ двойного побитового отрицания (NOT) работает только для 32-битных целых чисел, т.е. до (2**31)-1 = 2147483647. Поэтому для любого числа больше 2147483647, этот оператор будет выдавать неверные результаты. В таких случаях лучше использовать Math.floor().

16. Нахождение максимального и минимального числа в массиве

Можно применить цикл for для перебора каждого значения массива и найти максимальное или минимальное значение. Или же использовать метод Array.reduce() и найти эти числа в массиве.

Но можно сделать это в одну строчку с помощью оператора расширения.

// Короткая запись
const arr = [2, 8, 15, 4]; 
Math.max(...arr); // 15 
Math.min(...arr); // 2

17. Цикл for

Обычно для перебора массива используется традиционный цикл for. Для выполнения итерации по массивам можно воспользоваться циклом for…of. А для того, чтобы найти индекс каждого значения, применяется for…in.

let arr = [10, 20, 30, 40]; 

// Обычная запись
for(let i = 0; i < arr.length; i++){ 
    console.log(arr[i]); 
}

// Короткая запись
// цикл for of 
for(const val of arr){ 
    console.log(val); 
}

// Цикл for in
for(const index in arr){ 
    console.log(arr[index]); 
}

Также цикл for…in можно использовать для перебора свойства объекта.

let obj = {x: 20, y: 50}; 
for(const key in obj){ 
    console.log(obj[key]); 
}

18. Объединение массивов

let arr1 = [20, 30]; 

// Обычная запись 
let arr2 = arr1.concat([60, 80]); 
// [20, 30, 60, 80]

// Короткая запись
let arr2 = [...arr1, 60, 80]; 
// [20, 30, 60, 80]

19. Глубокое копирование объектов

Для глубокого копирования объектов можно совершить итерацию по каждому свойству и проверить, содержит ли текущее свойство какой-либо объект. Если да, то выполняется рекурсивный вызов той же самой функции, пропуская значение текущего свойства (т.е. вложенный объект).

Также при отсутствии функций, значений undefined, NaN или Date в объекте можно совершить глубокое копирование с помощью JSON.stringify() и JSON.parse().

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

let obj = {x: 20, y: {z: 30}}; 

// Обычная запись 
const makeDeepClone = (obj) => { 
    let newObject = {}; 
    Object.keys(obj).map(key => { 
        if(typeof obj[key] === 'object'){ 
            newObject[key] = makeDeepClone(obj[key]); 
        } 
        else{ 
            newObject[key] = obj[key]; 
        } 
    }); 
    return newObject; 
}

const cloneObj = makeDeepClone(obj); 

// Короткая запись 
const cloneObj = JSON.parse(JSON.stringify(obj));

// Короткая запись для одноуровневого объекта
let obj = {x: 20, y: 'hello'};
const cloneObj = {...obj};

Примечание: Это способ сокращения JSON.parse(JSON.stringify(obj)) не работает, если свойство объекта содержит функции, значения undefined, NaN или Date, потому что в таком случае они удаляются из объекта. Поэтому используйте этот способ, только когда объект содержит строки и числа.

20. Получение символов из строки

let str = 'jscurious.com'; 

// Обычная запись 
str.charAt(2); // c

// Короткая запись
str[2]; // c

Некоторые из этих приемов могут и не быть актуальными в проекте, но всегда хорошо знать дополнительные способы сокращения. Веселого кодирования! 

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

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Amitav Mishra: 20 JavaScript Shorthand Techniques that will save your time

Предыдущая статьяНепрерывная интеграция и развёртывание ПО: лучшие практики
Следующая статьяUX-текст - как он формирует продукт?