JavaScript — это мощный и универсальный язык программирования, широко используемый для веб-разработки. Как разработчики, мы всегда стремимся писать чистый и эффективный код. Один из способов добиться этого — использовать методы сокращения, которые не только уменьшают объем кода, который мы пишем, но и улучшают его читабельность. В этой статье мы рассмотрим некоторые распространенные приемы сокращенного кода в JavaScript, а также приведем практические примеры, чтобы продемонстрировать их эффективность.

1. Тернарный оператор (условный оператор)

Тернарный оператор — это краткий способ написания операторов if...else. Это позволяет нам быстро принимать решения в зависимости от условий.

// Longhand
let result;
if (condition) {
  result = 'Condition is true';
} else {
  result = 'Condition is false';
}

// Shorthand (Ternary Operator)
let result = condition ? 'Condition is true' : 'Condition is false';

// You can also nest your if statement like this
const answer = x > 10 ? "greater than 10" : x < 5 ? "less than 5" : "between 5 and 10";

2. Оценка короткого замыкания

Оценка короткого замыкания — это метод обработки значений по умолчанию или предотвращения ошибок при доступе к вложенным свойствам. Это особенно полезно для работы с потенциально неопределенными или нулевыми значениями.

// Longhand
let value;
if (obj && obj.property && obj.property.subProperty) {
  value = obj.property.subProperty;
} else {
  value = 'Default Value';
}

// Shorthand (Short-circuit Evaluation)
let value = obj?.property?.subProperty || 'Default Value';

3. Нулевой оператор объединения

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

// Longhand
let value;
if (inputValue !== null && inputValue !== undefined) {
  value = inputValue;
} else {
  value = 'Default Value';
}

// Shorthand (Nullish Coalescing Operator)
let value = inputValue ?? 'Default Value';

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

Стрелочные функции обеспечивают краткий способ написания функций, особенно для простых однострочных функций.

// Longhand
function add(a, b) {
  return a + b;
}

// Shorthand (Arrow Function)
const add = (a, b) => a + b;

5. Сокращение свойств объекта

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

// Longhand
const name = 'John';
const age = 30;

const person = {
  name: name,
  age: age,
};

console.log(person) // { name: 'John', age: 30}

// Shorthand (Object Property Shorthand)
const name = 'John';
const age = 30;

const person = {
  name,
  age,
};

console.log(person) // { name: 'John', age: 30}

6. Деструктивное назначение

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

// Longhand
const person = { name: 'John', age: 30 };
const name = person.name;
const age = person.age;
console.log({name, age}) // { name: 'John', age: 30 }

// Shorthand (Object Destructuring)
const { name, age } = { name: 'John', age: 30 };
console.log({name, age}) // { name: 'John', age: 30 }

// You can even assign your own variable names
const { name:firstName, age } = { name: 'John', age: 30 };
console.log({firstName, age}) // { firstName: 'John', age: 30 }

// Array Destructuring
const numbers = [1, 2, 3];
const [first, second, third] = numbers;
console.log({first, second, third}) // { first: 1, second: 2, third: 3 }

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

Используется для создания копий массивов или объектов и их объединения.

// Longhand (Array Concatenation)
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combinedArray = arr1.concat(arr2);
console.log(combinedArray) // [ 1, 2, 3, 4, 5, 6 ]

// Shorthand (Spread Operator)
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combinedArray = [...arr1, ...arr2];
console.log(combinedArray) // [ 1, 2, 3, 4, 5, 6 ]

8. Параметры функции по умолчанию

Укажите значения по умолчанию для параметров функции.

// Longhand
function greet(name) {
  if (name === undefined) {
    name = 'Anonymous';
  }
  console.log(`Hello, ${name}!`);
}

greet(); // Hello, Anonymous!
greet('John'); // Hello, John!

// Shorthand (Default Function Parameters)
function greet(name = 'Anonymous') {
  console.log(`Hello, ${name}!`);
}

greet(); // Hello, Anonymous!
greet('John'); // Hello, John!

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

Краткий способ объединения строк и встраивания выражений с использованием обратных кавычек (`) и ${}

// Longhand
const name = 'John';
const message = 'Hello, ' + name + '!';

// Shorthand (Template Literals)
const name = 'John';
const message = `Hello, ${name}!`;

10. Методы массива: карта, фильтр, уменьшение

Сокращенные методы для выполнения общих операций с массивами.

const numbers = [1, 2, 3, 4, 5];

// Longhand (map)
const doubled = numbers.map(function (num) {
  return num * 2;
});

console.log(doubled); // Output: [2, 4, 6, 8, 10]

// Shorthand (map)
const doubled = numbers.map((num) => num * 2);

console.log(doubled); // Output: [2, 4, 6, 8, 10]

// Longhand (filter)
const evens = numbers.filter(function (num) {
  return num % 2 === 0;
});

console.log(evens); // Output: [2, 4]

// Shorthand (filter)
const evens = numbers.filter((num) => num % 2 === 0);

console.log(evens); // Output: [2, 4]

// Longhand (reduce)
const sum = numbers.reduce(function (acc, num) {
  return acc + num;
}, 0);

console.log(sum); // Output: 15

// Shorthand (reduce)
const sum = numbers.reduce((acc, num) => acc + num, 0);

console.log(sum); // Output: 15

11. Логические операторы присваивания

Сокращение для объединения присваивания переменной с логическими операциями.

let x = 10;

// Longhand
x = x || 5; // If x is falsy, assign 5 to x.

// Shorthand (Logical OR Assignment)
x ||= 5; // If x is falsy, assign 5 to x.

let y = 0;

// Longhand
y = y && 8; // If y is truthy, assign 8 to y.

// Shorthand (Logical AND Assignment)
y &&= 8; // If y is truthy, assign 8 to y.

12. Несколько объявлений переменных

Компактный способ объявить несколько переменных в одной строке.

// Longhand
let a = 1;
let b = 2;
let c = 3;

// Shorthand (Multiple Variable Declarations)
let a = 1, b = 2, c = 3;

13. Оператор возведения в степень

Сокращение для вычисления степени числа.

// Longhand
const result = Math.pow(2, 3); // 2^3 = 8

// Shorthand (Exponentiation Operator)
const result = 2 ** 3; // 2^3 = 8

14. Для цикла

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

// Longhand
const fruits = ['apple', 'banana', 'orange'];
for (let i = 0; i < fruits.length; i++) {
  console.log(fruits[i]); // apple, banana, orange
}

// Shorthand
const fruits = ['apple', 'banana', 'orange'];
for (let fruit of fruits) {
  console.log(fruit); // apple, banana, orange
}

// If you just wanted to access the index, do
for (let index in fruits) {
  console.log(index); // 0, 1, 2
}

// This also works if you want to access keys in a literal object
const obj = {continent: 'Africa', country: 'Kenya', city: 'Nairobi'}
for (let key in obj) {
  console.log(key); // Output: continent, country, city
}

15. Двойное побитовое НЕ

Двойное побитовое НЕ — это сокращенная техника в JavaScript, позволяющая дважды (~~) выполнить операцию побитового НЕ над числовым значением. Он часто используется как быстрый и лаконичный способ преобразования значения в целое число или округления числа до нуля.

// Longhand
const num = 3.14159;
const roundedNum = Math.floor(num);

// Shorthand (Double Bitwise NOT)
const num = 3.14159;
const roundedNum = ~~num;

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

Чтобы преобразовать строку в число с помощью методов сокращения в JavaScript, вы можете использовать конструктор Number() или сокращение унарного оператора +.

// Longhand with the Number() constructor
const stringFloat = '3.14';
const floatNumber = Number(stringFloat);
console.log(floatNumber); // 3.14

// Shorthand with the unary operator '+'
const stringNumber = '42';
const number = +stringNumber;
console.log(number); // 42

Заключение

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