JavaScript 한 줄 'if'문-최고의 구문,이 대안?


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
나는 후자를 좋아한다. 첫 번째 의견과 창의적인 대안에 감사드립니다!
David Hobs 1

당신은 당신이 빈 문자열 때문에, 기대와 0 falsy 값이 무엇인지 알아야한다, 그것은 두 번째 문 실행 실패
올랜도

1
물론, 거기에보다 명백한 부울 문장을 넣을 수도 있습니다
acjay

7
@PeterOlson 왜 유지 보수성 이의가 제기 되는가? 다른 개발자가 IDE를 구성과 함께 사용하지 않으면 어떻게 될까요?
agconti

2
대괄호없이 한 줄의 if 문을 지원할 수 있도록 용기를내어 주셔서 감사합니다. 언젠가 우리 아이들이 고마워 할 것입니다.
Marc M.

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");:)
Joseph Goh

나는 부울 강제를 암시하는 괄호를 좋아한다.
Daniel Sokolowski

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")


훌륭한 솔루션.
Davidson Lima

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");

15
왜 간단하지 var a = 11; alert(a === 10);않습니까?
ManuKaracho

@ ManuKaracho 삼항 문장으로 작업 할 때이 문제가 많이 발생합니다. OP가 단순한 것을 작성하려고 시도했을 수도 있지만 직장에서 읽은 코드에 만연한 것으로 알고 있습니다.
adam-beck

alert(a === 10 ? "true" : "false")
Josh Wood

@JoshWood 경고는 부울을 인쇄하므로 alert(a===10)Manu가 말한 것처럼 할 수 있습니다 .
Keith

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 문이 아니지만 map / reduce 또는 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 lemonsgive me bar"를 반환하고 싶습니다 .
Marc

(레몬)이 "foo give a bar"를 반환하면; 이것은 잘못이다. "Uncaught SyntaxError : Illegal return statement"
Fenec

@Fenec이 오류의 원인이되는 브라우저와 버전을 공유 하시겠습니까? 이것은 거의 2 년 전에 저에게 효과가 있었고 저에게 계속 효과가 있습니다.
마크

4

삼항 연산자를 사용하여 옹호하는 많은 투표로 많은 답변을 보았습니다. a) 대체 옵션이 있고 b) 간단한 조건에서 상당히 간단한 값을 반환하는 경우 삼항은 좋습니다. 그러나...

원래 질문에는 대안이 없었으며 단일 (실제) 지점 만있는 삼항 연산자는 영향을받는 답변을 반환하도록합니다.

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

가장 일반적인 변형은 lemons ? 'foo...' : '' 이며, true, false, truthy, falsey, null, nil, blank, empty에 대한 모든 언어에 대한 수많은 기사를 읽음으로써 알 수 있듯이 (입력하지 않고?) 지뢰밭 (잘 기록 된 지뢰밭이지만)

삼항의 일부가 복잡 해지 자마자보다 명시적인 형태의 조건을 사용하는 것이 좋습니다.

내가 투표한다고 말하는 먼 길 if (lemons) "foo".


2

while루프가 있는 단일 라인을 사용하여 다음 과 if같이 수행 할 수도 있습니다 .

if (blah)
    doThis();

while루프 와도 작동합니다 .


7
보푸라기가 실패하고 권장하지 않습니다
danwellman

9
OP는 또한 하나의 라이너를 요청했습니다.
aaron-coding

2

화살표 기능의 예 :

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

약속에서 :

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

그렇지 않으면:

if(somethingTrue) thenDo()

단순한 조건부 인 경우 가능한 한 항상 if (value)를 사용하는 것이 좋습니다 . 문의 시작 부분에 if 라는 단어 는 마비와 물음표보다 발생하는 일에 대해 더 많이 설명하기 때문입니다.


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

대괄호로도 할 수있는 작업 할당

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

"할당 작업도 둥근 괄호로 할 수 있습니다". 이것은 매우 흥미 롭습니다.이 한 줄 작업 내에서 작업을 할당 할 수 있다는 것을 몰랐습니다.
시상
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.