Нулевой оператор объединения (??)

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

// returns 'default value'
null ?? 'default value'

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

// if 'name' is not defined,
// we pass a default string into our function.
customFunc(name ?? 'default')

Примечание против оператора ИЛИ

Многие думают, что это то, что делает оператор ИЛИ (||).
Однако оператор ИЛИ возвращает свою правую часть, когда левая часть ложная, а не просто нулевая. Сюда входят такие данные, как 0 и ‘’.

Необязательная цепочка (?.)

Используя необязательную цепочку, при доступе к свойствам, если какая-либо ссылка на свойство имеет нулевое значение, выражение возвращает неопределенное значение, а не вызывает ошибку.

const object = {
  property1: {
    name: 'P1'
  }
}

// returns undefined and doesn't cause an error
object.property2?.name

Это также работает при вызове функций.

// will call 'customFunc' if it exists on 'object',
// or returns undefined if not.
object.customFunc?.()

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

💡 Совет. Нулевые операторы объединения и необязательные операторы цепочки лучше всего использовать с TypeScript, так как вы будете точно знать, когда их использовать.

Логическая и оценка короткого замыкания

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

// returns 'this'
true && 'this'

Сокращение с помощью оператора && позволяет оценить условие перед вызовом функции. Таким образом, вы можете избежать необходимости писать подробный оператор if перед вызовом чего-либо.

// calls func() if 'variable' is true
variable && func()

Включает в себя()

Array.includes() — это способ проверить, содержит ли массив что-либо.

[1, 2, 3].includes(2) // returns true

Это можно использовать как способ избежать множественных условных проверок, сократить код, а также сделать его более читабельным.

// instead of this
if(var === 'A' || var === 'B' || var === 'C')
  return var
  
// do this
if(['A', 'B', 'C'].includes(var)) 
  return var

Для и для каждого()

Цикл можно сделать намного чище, используя for of и .forEach(), а не традиционный цикл for. Важным моментом использования forEach() является то, что его можно объединить в цепочку, что сделает ваш код более кратким и читабельным.

// a tiny amount of code for looping over wanted items in an array.
// can be chained further for more complicated cases.
arr.filter((i) => i > 0)
   .forEach((v, i) => console.log(v));

С другой стороны, существует множество пограничных случаев при использовании forEach(), таких как отсутствие включения пустых элементов и некорректная работа с асинхронным/ожидающим кодом. В таких случаях лучше всего использовать «for of», что также довольно лаконично, хотя и не имеет такого количества пограничных случаев, как forEach() или «for in».

// for performing the same function as above.
// not as concise for more complicated cases but more robust.
for (const i of arr.filter((i) => i > 0)) 
  console.log(i)
// or
for (const i of arr) 
  if(i > 0) console.log(i)

Распространенный синтаксис (…)

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

// combine two arrays, inserting '3' between the two.
const arr1 = [1, 2]
const arr2 = [4, 5]

const newArr = [...arr1, 3, ...arr2]
// newArr = [1, 2, 3, 4, 5]

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

// create a new object with the same properties as obj1 and obj2,
// while also adding another property 'newProperty'.
const obj1 = {property1: 'p1'}
const obj2 = {property2: 'p2'}

const newObj = {...obj1, ...obj2, newProperty: 'newP'}
// newObj = {property1: 'p1', property2: 'p2', newProperty: 'newP'}

Оператор деструктуризации и отдыха (…)

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

// getting the 'id' property from obj.
const obj = {id: 1}

const {id} = obj
// id = 1

// or we can have a custom variable name.
const {id: idLabel} = obj
// idLabel = 1

Точно так же оператор rest можно использовать для отделения свойств от объекта. Это полезно для быстрого копирования объекта при удалении некоторых свойств.

// copying obj1, removing the 'unwanted' property.
const obj = {id: 1, unwanted: 2}

const {unwanted, ...newObj} = obj
// newObj = {id: 1}

💰 Бонус: удаление дубликатов из массива

Хотите быстрый способ удаления повторяющихся примитивных элементов из массива? Это очень легко сделать с помощью небольшого фрагмента кода с помощью «new Set()».
Сочетание этого с другими методами чистого кода может привести к очень мощным действиям с минимальным кодом.

// using set with the spread syntax to combine two arrays, removing duplicates (a union).
const arr1 = [1, 2, 3]
const arr2 = [3, 4, 5]

const arr3 = [...new Set([...arr1, ...arr2])] 
// arr3 = [1, 2, 3, 4, 5] as an array

Спасибо за прочтение ❤️. Если вам понравилась эта статья, поделитесь ею.
Проверьте мой github, веб-сайт и другие статьи.

Первоначально опубликовано на https://dev.to 22 декабря 2021 г.