Один рядок 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
Я думаю, ви можете задуматися над короткою, якщо, інакше твердженням. ( variable = (condition) ? true-value : false-value;.) Удачі.
Прого

Відповіді:


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
Дякую за те, що ви досить сміливі, щоб висловитись на підтримку одного рядка, якщо заяви без дужок. Одного разу наші діти подякують вам.
Марк М.

135

Я використовую це так:

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

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

43

Ви можете використовувати цей формат, який зазвичай використовується в 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');

Я вважаю за краще це. сподіваюся, що це комусь допоможе


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
стиг

15

// Ще один простий приклад

 var a = 11;
 a == 10 ? alert("true") : alert("false");

15
чому б не просто .. var a = 11; alert(a === 10);?
ManuKaracho

@ManuKaracho Я дуже бачу цю проблему під час роботи з потрійними заявами. Я розумію, що ОП, можливо, просто намагався написати простий, але це розгул у коді, який я читав на роботі.
adam-beck

alert(a === 10 ? "true" : "false")
Джош Вуд

@JoshWood сповіщення також надрукує булеви, тож ви можете просто так, alert(a===10)як сказав Ману.
Кіт

12

Як вже багато людей сказали, якщо ви шукаєте фактичний 1 рядок, якщо тоді:

    if (Boolean_expression) do.something();

є кращим. Однак, якщо ви хочете зробити if / else, то потрійний - ваш друг (а також супер круто):

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

ТАКОЖ:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Однак я побачив один дуже класний приклад. Кричить на @ Peter-Oslson за &&

    (Boolean_expression) && do.something();

Нарешті, це не оператор if, але виконання речей у циклі з картою / зменшенням або Promise.resolve () теж забавно. Кричить на @brunettdan


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'


При однорядних коротких замиканнях ми можемо опустити «повернення», і воно має працювати так, як очікувалося. `` `лимони &&" foo дали мені бар "; // працює! `` `
siwalikm

@siwalikm ви могли б пояснити? Це стосується випадку, коли ви не хочете повертатися lemons(якщо це фальси) - ви хочете повернути лише "foo дав мені бар", коли lemonsце truthy.
Marc

if (лимони) return "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петлями.


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 (значення), коли це можливо, тому що слово, якщо на початку висловлювання говорить більше про те, що відбувається, ніж парантез та знаки запитань.


1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Навіть призначити операцію також ми можемо робити з круглими дужками

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));

"Навіть призначити операцію також ми можемо робити з круглими дужками". Це дуже цікаво, я не знав, що можна робити операції по призначенню всередині цих однолінійних операцій.
сагит
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.