Одна строка «if» в JavaScript - лучший синтаксис, эта альтернатива?

201

Было ясно сформулировано, хотя, тем не менее, мнение, что отказ от фигурных скобок в однострочном ifвыражении не идеален для удобства обслуживания и удобочитаемости.

Но как насчет этого?

if (lemons) { document.write("foo gave me a bar"); }

Он еще более сжат, и если его развернуть, фигурные скобки не будут забыты. Есть ли какие-то вопиющие проблемы, и если нет, каковы соображения? Я чувствую, что это все еще очень читабельно, по крайней мере, так же, как и троичный оператор в любом случае. Мне кажется, что троичные операторы не так часто предлагаются из-за читабельности, хотя я чувствую, что этот вывод не столь единодушен.

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

(syntax) ? document.write("My evil twin emerges"): "";
Дэвид Хобс
источник
2
Было бы неплохо, если бы JavaScript поддерживал условия конца фразы:document.write("My evil twin emerges") if lemons
Beau Smith
7
Я думаю, что вы можете подумать о коротком заявлении if, else. ( variable = (condition) ? true-value : false-value;.) Удачи.
Progo

Ответы:

328

Я видел короткое замыкание, используемое &&оператором для достижения этой цели, хотя людям, которые не привыкли к этому, может быть трудно прочитать или даже назвать это анти-паттерном:

lemons && document.write("foo gave me a bar");  

Лично я часто буду использовать однострочные ifбез скобок, например:

if (lemons) document.write("foo gave me a bar");

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

Питер Олсон
источник
11
Мне нравится последнее. Спасибо за вклад и еще одну креативную альтернативу на первом!
Дэвид Хобс
вы должны знать, что вы ожидаете, так как пустая строка и 0 являются ложными значениями, он не сможет выполнить второй оператор
Орландо
1
Конечно, вы также можете поместить туда более явное логическое выражение
Acjay
7
@PeterOlson, почему споры по поводу ремонтопригодности спорны? Что делать, если какой-либо другой разработчик не использует вашу IDE со своей конфигурацией.
agconti
2
Спасибо за то, что вы были достаточно смелыми, чтобы выступить в поддержку однострочных операторов без скобок. Однажды наши дети будут вам благодарны.
Марк М.
136

Я использую это так:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");
asael2
источник
36
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji
44

Вы можете использовать этот формат, который обычно используется в PHP:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");
макрос
источник
12
Вам не нужны скобки на lemon.
Leymannx
6
Рекомендуется включать () вокруг условного оператора - устраняет путаницу в отношении порядка операций и т. Д. Для других разработчиков. Я обычно ошибаюсь в определении этого, за исключением случаев, когда кто-то с хорошей квалификацией не может запутаться.
DJVS
1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Джозеф Го
Мне нравятся скобки, так как для меня они подразумевают логическое принуждение.
Даниэль Соколовский
18

Эта строка намного чище.

if(dog) alert('bark bark');

Я предпочитаю это. надеюсь, это поможет кому-то

shakee93
источник
16

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

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

объяснение: если lemonsесть, то дайте мнеalert("please give me a lemonade") else alert("then give me a beer")

Мохидин бин Мухаммед
источник
Отличное решение.
Дэвидсон Лима
1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
STIB
15

// Еще один простой пример

 var a = 11;
 a == 10 ? alert("true") : alert("false");
user3413838
источник
15
почему не просто .. var a = 11; alert(a === 10);?
МануКарачо
@ManuKaracho Я часто вижу эту проблему при работе с троичными выражениями. Я понимаю, что OP, возможно, только что пытался написать простую, но она свирепствует в коде, который я читаю на работе.
Адам Бек
alert(a === 10 ? "true" : "false")
Джош Вуд
@JoshWood предупреждение также будет выводить логические значения, так что вы можете просто сделать, alert(a===10)как сказал Ману.
Кит
12

Как говорили многие люди, если вы ищете фактическую 1 строку, то:

    if (Boolean_expression) do.something();

является предпочтительным. Однако, если вы хотите сделать if / else, то ternary - ваш друг (и тоже супер круто):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

ТАКЖЕ:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Однако я увидел один очень крутой пример. Кричит @ Питер-Олсон для &&

    (Boolean_expression) && do.something();

Наконец, это не оператор if, но выполнение вещей в цикле с помощью map / redu или Promise.resolve () тоже забавно. Кричит @brunettdan

Kemacal
источник
7

Как уже было сказано, вы можете использовать:

&& стиль

lemons && document.write("foo gave me a bar");  

или

стиль без скобок

if (lemons) document.write("foo gave me a bar");

возврат короткого замыкания

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

if (lemons) return "foo gave me a bar";

так как

lemons && return "foo gave me a bar"; // does not work!

даст вам SyntaxError: Unexpected keyword 'return'

Марк
источник
В однолинейных коротких замыканиях мы можем опустить 'return', и это должно работать как положено. `` `лимоны &&" Фу дал мне бар "; // работает! `` `
siwalikm
@siwalikm не могли бы вы объяснить? Это для случая, когда вы не хотите возвращаться lemons(если это неверно) - вы хотите возвращать «foo дал мне бар» только тогда, когда lemonsэто правда.
Marc
if (лимоны) возвращают "foo дал мне бар"; это не верно. Он выдаст вам «Uncaught SyntaxError: незаконное выражение возврата»
Fenec
@Fenec, поделитесь ли вы браузером и версией, которая вызывает эту ошибку? Это сработало для меня почти 2 года назад и продолжает работать на меня.
Марк
4

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

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

lemons ? "foo gave me a bar" : "who knows what you'll get back"

Я думаю, что наиболее распространенным вариантом является lemons ? 'foo...' : '', и, как вы узнаете, прочитав множество статей для любого языка на истину, ложь, правду, ложь, ноль, ноль, пусто, пусто (с нашим без?), Вы входите минное поле (хотя и хорошо задокументированное минное поле)

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

Долгий способ сказать, за что я голосую if (lemons) "foo".

Анита Грэм
источник
2

Это также можно сделать, используя одну строку с whileциклами и ifвот так:

if (blah)
    doThis();

Это также работает с whileпетлями.

Noitidart
источник
7
Это не справится и не рекомендуется
danwellman
9
ОП также попросил однострочник.
кодирование
2

Пример в функциях стрелок:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

В обещаниях:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

В противном случае:

if(somethingTrue) thenDo()

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

brunettdan
источник
1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Даже назначить операцию также мы можем сделать с круглыми скобками

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));
Саджит Мантхарат
источник
«Даже назначьте операцию и мы можем сделать с круглыми скобками». Это очень интересно, я не знал, что можно было выполнять операции присваивания внутри этих однострочных операций.
сагитс