Чистый и простой код: 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]]

Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: