В этой статье за ​​короткое время рассказывается, как писать более простые условные суждения в JavaScript, что поможет вам писать более лаконичный и читабельный код.

Предположим, у нас есть функция, которая преобразует значения цвета в шестнадцатеричное кодирование.

function convertToHex(color) {
  if (typeof color === 'string') {
    if (color === 'slate') {
      return '#64748b'
    } else if (color === 'gray') {
      return '#6b7280'
    } else if (color === 'red') {
      return '#ef4444'
    } else if (color === 'orange') {
      return '#f97316'
    } else if (color === 'yellow') {
      return '#eab308'
    } else if (color === 'green') {
      return '#22c55e'
    } else {
      return '#ffffff'
    }
  } else {
    return '#ffffff'
  }
}

Цель этой функции очень проста: передать строку цвета, а затем вернуть соответствующее шестнадцатеричное число. Если входящая строка не является строкой или ничего не передается, то возвращается белое шестнадцатеричное число.

Далее начинаем оптимизировать этот код.

Избегайте использования строк непосредственно в качестве условий

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

convertToHex("salte")

Чтобы избежать этой ошибки, мы можем использовать константы.

const Colors = {
 SLATE: 'slate',
  GRAY: 'gray',
  // ...
}
function convertToHex(color) {
  if (typeof color === 'string') {
    if (color === Colors.SLATE) {
      return '#64748b'
    } else if (color === Color.GRAY) {
      return '#6b7280'
    }
    // ...
  } else {
    return '#ffffff'
  }
}
convertToHex(Colors.SLATE)

Если вы используете typescript, вы можете использовать enum напрямую.

Использовать объект

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

const Colors = {
 SLATE: '#64748b',
  GRAY: '#6b7280',
  // ...
}
function convertToHex(color) {
  if (color in Colors) {
    return Colors[color]
  } else {
    return '#ffffff'
  }
}
convertToHex(Colors.SLATE)

Таким образом, код будет более кратким и читабельным.

Не соответствует ожиданиям, возвращайтесь раньше

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

const Colors = {
 SLATE: '#64748b',
  GRAY: '#6b7280',
  // ...
}
function convertToHex(color) {
  if (!color in Colors) {
    return '#ffffff'
  }
  return Colors[color]
}
convertToHex(Colors.SLATE)

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

Использовать карту с объектом

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

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

const ColorsEnum = {
 SLATE: 'slate',
  GRAY: 'gray',
  // ...
}
const Colors = new Map()
Colors.set(ColorsEnum.SLATE, '#64748b')
Colors.set(ColorsEnum.GRAY, '#6b7280')
// ...
Colors.set('DEFAULT', '#ffffff')
function convertToHex(color) {
  if (!Colors.has(color)) {
    return Colors.get('DEFAULT')
  }
  return Colors.get(color)
}
convertToHex(Colors.SLATE)

Карта также может хранить функции

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

Затем мы можем использовать карту для хранения функций.

return Colors.get(color)()

Старайтесь избегать троичных выражений и переключайтесь

Хотя тернарное выражение короткое, его удобочитаемость сильно снижается. Если это многоуровневое состояние, его будет очень трудно прочитать.

Нет очевидного преимущества switch и if, но иногда легко вернуться и заставить код выполняться не так, как ожидалось.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord.