Рубріки: Решения

Чистый и простой код: 10 лайфхаков для JavaScript-разработчика

Богдан Мирченко

Разработчик Хасиб Анар поделился десятью приемами, как писать емкий и чистый JavaScript-код. По его мнению, в JS полно интересных функций, о которых не знают многие разработчики, особенно уровня джуниор и мидл. Предлагаем ознакомиться с ними и посчитать, сколько из них вы знаете.

1. Добавление свойства в объект по условию

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

const condition = true;
const person = {
  id: 1,
  name: 'John Doe',
  ...(condition && { age: 16 }),
};

Оператор &&  возвращает последнее вычисленное выражение, если значение каждого операнда true. В примере выше возвращается объект {age: 16}, который затем распространяется, что стать частью объекта person. 

Если условие false:

const person = {
  id: 1,
  name: 'John Doe',
  ...(false), // evaluates to false
};
// spreading false has no effect on the object
console.log(person); // { id: 1, name: 'John Doe' }

Источник — https://betterprogramming.pub/10-modern-javascript-tricks-every-developer-should-use-377857311d79

2. Проверка наличия свойства в объекте

С помощью ключевого слова in можно проверить наличие свойства в объекте JavaScript. Вот как это делается:

const person = { name: 'John Doe', salary: 1000 };
console.log('salary' in person); // returns true
console.log('age' in person); // returns false

3. Динамические имена свойств в объектах

Чтобы добавить свойства, используйте обозначение [‘key_name’]:

const dynamic = 'flavour';

var item = {
  name: 'Biscuit',
  [dynamic]: 'Chocolate'
}

console.log(item); // { name: 'Biscuit', flavour: 'Chocolate' }

Тот же прием можно использовать для ссылки на свойства объекта с помощью динамического ключа: 

const keyName = 'name';

console.log(item[keyName]); // returns 'Biscuit'

4. Деструктуризация объекта с динамическими ключами

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

Вот как можно переименовать переменные при деструктуризации с помощью алиасов (псевдонимов):

const person = { id: 1, name: 'John Doe' };

const { name: personName } = person;

console.log(personName); // returns 'John Doe'

А вот как с помощью динамического ключа:

const templates = {
  'hello': 'Hello there',
  'bye': 'Good bye'
};

const templateName = 'bye';

const { [templateName]: template } = templates;

console.log(template) // returns 'Good bye'

5. Оператор нулевого слияния ??

Оператор ?? полезен, когда нужно проверить, равно ли некоторое значение null или undefined. Он возвращает выражение с правой стороны оператора, когда левое выражение равно null или undefined, в противном случае возвращается выражение с левой стороны:

const foo = null ?? 'Hello';
console.log(foo); // returns 'Hello'

const bar = 'Not null' ?? 'Hello';
console.log(bar); // returns 'Not null'

const baz = 0 ?? 'Hello';
console.log(baz); // returns 0

В третьем примере возвращается 0, а не строка с правой стороны оператора. Несмотря на то, что 0 имеет ложное значение в JavaScript, он не является null или undefined, оператор нулевого слияния его игнорирует.

const cannotBeZero = 0 || 5;
console.log(cannotBeZero); // returns 5

const canBeZero = 0 ?? 5;
console.log(canBeZero); // returns 0

6. Опциональные последовательности ?.

 Вас тоже раздражают ошибки доступа к свойствам несуществующего объекта типа TypeError: Cannot read property ‘foo’ of null? Это головная боль каждого разработчика JavaScript.

Решить проблему можно с помощью оператора опциональной последовательности:

const book = { id:1, title: 'Title', author: null };

// normally, you would do this
console.log(book.author.age) // throws error
console.log(book.author && book.author.age); // returns null (no error)

// with optional chaining
console.log(book.author?.age); // returns undefined

// or deep optional chaining
console.log(book.author?.address?.city); // returns undefined

Опциональные последовательности можно использовать даже для вызова методов:

const person = {
  firstName: 'Haseeb',
  lastName: 'Anwar',
  printName: function () {
    return `${this.firstName} ${this.lastName}`;
  },
};

console.log(person.printName()); // returns 'Haseeb Anwar'
console.log(persone.doesNotExist?.()); // returns undefined

7. Логическое преобразование с помощью оператора !!

Оператор !! может использоваться для быстрого преобразования результата в булево true или false. Вот как это сделать:

const greeting = 'Hello there!';
console.log(!!greeting) // returns true

const noGreeting = '';
console.log(!!noGreeting); // returns false

8. Преобразование между строками и числами

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

const stringNumer = '123';

console.log(+stringNumer); // returns integer 123
console.log(typeof +stringNumer); // returns 'number'

Обратное преобразование выполняется так:

const myString = 25 + '';

console.log(myString); // returns '25'
console.log(typeof myString); // returns 'string'

9. Проверка ложных значений в массиве

Наверняка вы уже знакомы с такими методами перебора массива, как filter, some и every. Но иногда может потребоваться простая проверка истинных значений с помощью логического оператора Boolean:

const myArray = [null, false, 'Hello', undefined, 0];

// filter falsy values
const filtered = myArray.filter(Boolean);
console.log(filtered); // returns ['Hello']

// check if at least one value is truthy
const anyTruthy = myArray.some(Boolean);
console.log(anyTruthy); // returns true

// check if all values are truthy
const allTruthy = myArray.every(Boolean);
console.log(allTruthy); // returns false

Эти методы принимают функцию обратного вызова, поэтому мы передаем Boolean как функцию обратного вызова. Логическое значение принимает аргумент и возвращает true или false в зависимости от того, будет ли аргумент true. Можно переписать так:

myArray.filter(val => Boolean(val));

Или даже так:

myArray.filter(Boolean);

10. Уменьшение уровня вложенности в массиве массивов

С помощью метода Array.prototype.flat можно создать единый массив, поднимая его содержимое на уровень родительского:

const myArray = [{ id: 1 }, [{ id: 2 }], [{ id: 3 }]];

const flattedArray = myArray.flat(); 
// returns [ { id: 1 }, { id: 2 }, { id: 3 } ]

Также можно определить уровень глубины массива, для этого нужно передать в метод соответствующий параметр:

const arr = [0, 1, 2, [[[3, 4]]]];

console.log(arr.flat(2)); // returns [0, 1, 2, [3,4]]

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023