Вы пробовали кодировать без if?

JavaScript

Переводчик пресса:Очень весело пытаться кодировать без if, и, если вы понимаете, что «данные — это код, код — это данные»?

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

Когда я учу новичков программировать, мне нравится давать им небольшие задачи, такие как: решение некоторых задач программирования без использования операторов if (или тернарных операторов, операторов switch и т. д.).

Есть ли смысл это делать?

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

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

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

Кроме того, это очень интересно, когда вы пытаетесь программировать без операторов if.

Пример 1: подсчет нечетных чисел в массиве

Предположим, у нас есть массив целых чиселarrayOfIntegers, теперь нам нужно посчитать количество нечетных чисел:

const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];

использовать, если

let counter = 0;
arrayOfIntegers.forEach((integer) => {
  const remainder = Math.abs(integer % 2);
  if (remainder === 1) {
    counter++;
  }
});

console.log(counter);

нет, если

let counter = 0;

arrayOfIntegers.forEach((integer) => {
  const remainder = Math.abs(integer % 2);
  counter += remainder;
});

console.log(counter);

Когда мы не используем if, мы ловко используем свойства нечетных и четных чисел, а их остатки при делении на 2 равны 0 и 1 соответственно.

Пример 2: Определение рабочих и выходных дней

указана дата (напримерnew Date()), чтобы определить, является ли это рабочим днем ​​или выходным, и вернуть «выходной» и «будний день» соответственно.

использовать, если

const weekendOrWeekday = (inputDate) => {
  const day = inputDate.getDay();

  if (day === 0 || day === 6) {
    return 'weekend';
  } 
  
  return 'weekday';

  // Or, for ternary fans:
  // return (day === 0 || day === 6) ? 'weekend' : 'weekday';
};

console.log(weekendOrWeekday(new Date()));

нет, если

const weekendOrWeekday = (inputDate) => {
  const day = inputDate.getDay();

  return weekendOrWeekday.labels[day] || 
         weekendOrWeekday.labels['default'];
};

weekendOrWeekday.labels = { 
  0: 'weekend', 
  6: 'weekend', 
  default: 'weekday' 
};

console.log(weekendOrWeekday(new Date()));

Вы обнаружили, что на самом деле в операторе if содержится некоторая информация? Он говорит нам, какой день выходной, а какой день будний. Итак, чтобы избавиться от оператора if, нам просто нужно записать эту информацию вweekendOrWeekday.labelsобъект и использовать его напрямую.

рекламировать:Если вам нужно отслеживать ошибки в онлайн-коде JavaScript, вы можете использовать его бесплатно.Fundebug!

Пример 3: функция удвоения

Напишите функцию удвоения, которая выполняет разные операции в зависимости от типа параметра:

  • Если аргумент является числом, умножить на 2 (т.е.5 => 10, -10 => -20);
  • Если аргумент является строкой, каждый символ повторяется 2 раза (т.е.'hello' => 'hheelloo');
  • Если параметр является функцией, он вызывается 2 раза;
  • Если параметр является массивом, вызовите функцию удвоения с каждым элементом в качестве параметра.
  • Если аргумент является объектом, вызовите функцию Doubler с каждым значением свойства в качестве аргумента

использовать переключатель

const doubler = (input) => {
  switch (typeof input) {
    case 'number':
      return input + input;
    case 'string':
      return input
        .split('')
        .map((letter) => letter + letter)
        .join('');
    case 'object':
      Object.keys(input)
            .map((key) => (input[key] = doubler(input[key])));
      return input;
    case 'function':
      input();
      input();
  }
};

console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello' }));
console.log(
  doubler(function() {
    console.log('call-me');
  }),
);

нет переключателя

const doubler = (input) => {
  return doubler.operationsByType[typeof input](input);
};

doubler.operationsByType = {
  number: (input) => input + input,
  string: (input) =>
    input
      .split('')
      .map((letter) => letter + letter)
      .join(''),
  function: (input) => {
    input();
    input();
  },
  object: (input) => {
    Object.keys(input)
          .map((key) => (input[key] = doubler(input[key])));
    return input;
  },
};

console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello' }));
console.log(
  doubler(function() {
    console.log('call-me');
  }),
);

Как видите, я привязал операцию, соответствующую каждому типу параметра, кdoubler.operationsByType, так что функцию удвоения можно реализовать без оператора switch.

О Фундебаге

FundebugСосредоточьтесь на JavaScript, мини-программах WeChat, мини-играх WeChat, мини-программах Alipay, React Native, Node.js и мониторинге ошибок Java в режиме реального времени. С момента официального запуска Double Eleven в 2016 году Fundebug обработал более 600 миллионов ошибок и был признан многими известными пользователями, такими как Google, 360 и Kingsoft. Бесплатная пробная версия приветствуется!


Ваши пользователи сталкиваются с ошибками?

Демонстрация опыта Бесплатное использование