Разработчик Хасиб Анар поделился десятью приемами, как писать емкий и чистый JavaScript-код. По его мнению, в JS полно интересных функций, о которых не знают многие разработчики, особенно уровня джуниор и мидл. Предлагаем ознакомиться с ними и посчитать, сколько из них вы знаете.
Можно использовать оператор распространения …
, чтобы быстро добавлять свойства к объекту 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
С помощью ключевого слова in
можно проверить наличие свойства в объекте JavaScript. Вот как это делается:
const person = { name: 'John Doe', salary: 1000 }; console.log('salary' in person); // returns true console.log('age' in person); // returns false
Чтобы добавить свойства, используйте обозначение [‘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'
Как известно, можно деструктуризировать переменную и сразу же переименовать ее свойства с помощью : 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'
??
Оператор ??
полезен, когда нужно проверить, равно ли некоторое значение 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
?.
Вас тоже раздражают ошибки доступа к свойствам несуществующего объекта типа 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
!!
Оператор !!
может использоваться для быстрого преобразования результата в булево true
или false
. Вот как это сделать:
const greeting = 'Hello there!'; console.log(!!greeting) // returns true const noGreeting = ''; console.log(!!noGreeting); // returns false
Быстро преобразовать строку в число с помощью унарного оператора +
можно следующим образом:
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'
Наверняка вы уже знакомы с такими методами перебора массива, как 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);
С помощью метода 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]]
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…