Допустимо ли использовать && вместо if? - PullRequest
3 голосов
/ 18 июня 2019

Я использую && вот так и работает

typeof foo === 'function' && foo(); //if foo exist then call it

вместо

if (typeof foo === 'function') { foo(); }

Это неправильно или просто вопрос стиля и вкуса? Для меня это естественно, и я хочу использовать &&, но теперь Линтер пожаловался: Ожидал присваивания или вызова функции и вместо этого увидел выражение.

Здесь могут быть какие-то реальные проблемы или это просто вопрос соглашения?


Вот фрагмент кода:

function foo(x) {
  console.log("foo say " + x)
}

function bar(x) {
  console.log("bar say " + x)
}

let s = "OK"

typeof foo === 'function' && foo(s)

if (typeof bar === 'function') bar(s)

/*
   Function noo() does not exist.
   Error to try call it is prevented by the check.
   noo && noo() is not enough, so typeof is a must! 
*/
typeof noo === 'function' && noo()

console.log("OK so far")

Примечания

  • Для пояснения моей целью было использовать && в качестве проверки существования (объявленной и определенной).
  • Если левая сторона && не пройдена, правая сторона не будет выполняться
  • Это полезно в return и в назначениях, но if - нет. Если требуется else -part, используйте ?. , тогда еще части должны возвращать тот же тип.
  • Сначала я пропустил typeof и исправил, но вижу в комментариях, что пропустил. Может быть, общая ошибка или просто легкое написание, пока мы все показываем понимание. Но чтобы быть точным (я думаю) - единственный способ проверить существование - это typeof, instanceof или try, за исключением window вещи, которые вы можете сделать, например, history && history.back().
  • try { foo(); }; catch (e) {}; можно использовать. Должно присутствовать хотя бы одно предложение catch или предложение finally .
  • if (a()) {b(); c()} равно a() && (b(), c()), потому что функции могут быть как в выражениях, так и в выражениях. Используйте оператор запятой .
  • Экстремальное значение - это то, что функция не объявлена, а другое - когда функция уже вернула значение x = x || foo(), ей не нужно возвращаться снова (это называется запоминанием детерминированной функции)

Ответы [ 3 ]

3 голосов
/ 18 июня 2019

Вы можете использовать оператор void .Это вычисляет выражение и возвращает undefined.

void (foo && foo());

var foo;

void (foo && foo());

foo = () => console.log('foo');

void (foo && foo());
3 голосов
/ 18 июня 2019

Задача Линтера состоит в том, чтобы искать вещи, которые, хотя синтаксически действительны , могут не соответствовать рекомендуемым рекомендациям.

«Ожидается присваивание или вызов функции», вероятно, означает, что он ожидает, что foo будет foo() или foo = в первой части, что его просмотр без вызова, по его мнению, является ошибкой.

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

2 голосов
/ 18 июня 2019

На заднем плане есть еще кое-что с &&, но в 99% случаев это прекрасно, так же, как этот.

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

Если вы знаете, чтовы делаете, линтеры слишком придирчивы иногда.

...