JavaScript의 한 줄 문장에 중괄호가 필요합니까?


163

한 번의 문장에 중괄호를 남겨두면 JavaScript에서 해로울 수 있다고 들었습니다. 더 이상 추론을 기억하지 못하고 Google 검색은별로 도움이되지 않았습니다.

JavaScript에서 중괄호 안에있는 모든 문장을 둘러싸는 것이 좋은 아이디어가 있습니까?

모두가 그렇게 보이기 때문에 묻습니다.


5
참고 : 한 줄에 여러 개의 문이 있어도 첫 번째 문만 범위를 가정하므로 "한 줄 문"이 아니라 단일 문
Kris Ivanov


@Blorgbeard : 아니요, 실제로 그 대답에 답했습니다.
Tower

그렇습니다. 신경 쓰지 마 :)
Blorgbeard는

답변은 다음과 같습니다. medium.com/@jonathanabrams/…
Erwan Legrand

답변:


204

아니

그러나 그들은 추천합니다. 성명을 확장하면 성명서가 필요합니다.

이것은 완벽하게 유효합니다

if (cond) 
    alert("Condition met!")
else
    alert("Condition not met!")

그러나 항상 중괄호를 사용하는 것이 좋습니다. 본인이나 다른 사람이 명령문을 확장하는 경우에는 명령문이 필요하기 때문입니다.

이 방법은 모든 C 구문 스타일 언어에서 브레이스가 적용됩니다. C, C ++, Java, 심지어 PHP도 모두 중괄호없이 한 줄 명령문을 지원합니다. 당신은 당신이 두 문자 만 저장 하고 일부 사람들의 브레이싱 스타일로 줄을 저장하지 않는다는 것을 알아야합니다 . 나는 전체 괄호 스타일 (다음과 같은)을 선호하므로 조금 더 길어집니다. 코드 가독성이 매우 명확하다는 사실을 잘 알고 있습니다.

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}

28
+1, 유익한 답변. 개인적으로, 나는이 "권장 된"일을하는 것이 도움이되지 않았다. 나는 파이썬을 코딩 한 적이 없으므로 물건을 삽입하고 들여 쓰기가 중요하다고 기대하지는 않습니다. 문장을 추가하면 중괄호도 추가됩니다. 항상. 한 번도 기억 나지 않아요. JavaScript가 아닌 C #이 아닌 C가 아닙니다.
야콥

16
@ Kirk : Douglas Crockford가 권장합니다. 나는 그것이 주관적인 개인적 결정이라는 데 동의하지만 그룹에서 일할 때는 단순히 중괄호를 입력하는 것이 더 쉽습니다.
Josh K

10
@Josh, Crockford가 말했다. 그것이 마지막 단어 여야합니다. ;) (그냥 농담) 문제는이 점의 주관성이 모든 C와 같은 언어에 걸쳐 있으며, 두 위치 모두에 대해 강력한 의견을 찾을 수 있다는 것입니다.
Kirk Woll

11
제 개인적인 경험에 따르면 팔을 펴지 않으면 팀 작업을 할 때 큰 실수를 일으킬 수 있습니다.
Sirs

4
항상 중괄호 {}를 사용하는 것이 좋습니다. @Arx가 말했듯이 오류를 제거하면 오류가 발생할 여지가 훨씬 많습니다. 애플 은 iOS의 SSL / TLS에 중괄호를 사용하지 않았기 때문에 버그 가있었습니다
Keenan Lidral-Porter

94

가독성 측면이 있습니다. 복합 문장이있을 때는 매우 혼란 스러울 수 있습니다. 들여 쓰기는 컴파일러 / 통역사에게 도움이되지만 의미하는 것은 아닙니다.

var a;
var b;
var c;

//Indenting is clear
if (a===true)
  alert(a); //Only on IF
alert(b); //Always

//Indenting is bad
if (a===true)
  alert(a); //Only on IF
  alert(b); //Always but expected?

//Nested indenting is clear
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
alert (b); //Always

//Nested indenting is misleading
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
  alert (b); //Always but expected as part of first if?

//Compound line is misleading
//b will always alert, but suggests it's part of if
if (a===true) alert(a);alert(b); 
else alert(c); //Error, else isn't attached

그리고 확장 성 측면이 있습니다.

//Problematic
if (a===true)
  alert(a);
  alert(b); //We're assuming this will happen with the if but it'll happen always
else       //This else is not connected to an if anymore - error
  alert(c);

//Obvious
if (a===true) {
  alert(a); //on if
  alert(b); //on if
} else {
  alert(c); //on !if
} 

생각은 항상 괄호가 있다면 그 블록 안에 다른 문장을 삽입하는 것을 알고 있다는 것입니다.


4
그래서 우리는 항상 하나의 라이너로 사용해야합니다 if (a===true) alert(a);. 지금은 분명하다!
João Pimentel Ferreira

1
왼쪽 대괄호와 오른쪽 대괄호를 사용하면 조건이 명확 해집니다. 우리 중 몽상가들에게 왼쪽과 오른쪽 비행 조류라고도합니다.
HalfMens

61

질문은 한 줄로 진술에 대해 묻습니다. 그러나 제공된 많은 예제는 여러 줄로 된 문장을 기반으로 중괄호를 생략하지 않는 이유를 보여줍니다. 원하는 코딩 스타일 인 경우 한 줄에 대괄호를 사용하지 않는 것이 안전합니다.

예를 들어, 질문은 이것이 정상인지 묻습니다.

 if (condition) statement;

이것이 정상인지 묻지 않습니다.

 if (condition)
   statement;

필자는 대괄호를 생략하는 것이 덜 불필요한 구문으로 코드를 더 읽기 쉽게 만들기 때문에 바람직하다고 생각합니다.

내 코딩 스타일은 코드가 블록이 아닌 한 대괄호를 사용하지 않는 것입니다. 그리고 한 줄에 세미콜론으로 구분하여 여러 명령문을 사용하지 마십시오. 나는 이것이 읽기 쉽고 명확하며 'if'문법에 대한 범위 지정 문제가 결코 없다는 것을 알았습니다. 결과적으로 단일 if 조건문에 대괄호를 사용하려면 3 행이 필요합니다. 이처럼 :

 if (condition) {
   statement;
 }

if 문은 세로 공간을 덜 사용하고 코드가 더 작기 때문에 if 문을 사용하는 것이 좋습니다.

다른 사람들 이이 방법을 사용하도록 강요하지는 않지만 저에게 효과적이며 괄호를 생략하면 코딩 / 범위 지정 오류가 발생하는 방법에 대한 예제에 더 동의하지 않습니다.


1
나는 항상 중괄호를 포함해야한다고 생각했지만 지금은 다시 생각하고 있습니다. 당신은 당신의 편에 airbnb 스타일 가이드가 있습니다!
senderle

1
그러나 대부분의 코드 포맷터는이를 2 줄 형식으로 변경하고 문제가있는 코드로 돌아갑니다. 수직 공간 논쟁은 바보입니다. 가독성이 항상 뛰어나고 오늘날의 화면은 엄청납니다.
Kim

1
한 줄짜리 문장을 둘러싸 기 위해 각 브래킷에 추가 된 2 줄은 코드를 유지 관리 할 때 매우 신중한 개발자가 발생할 수있는 잠재적 인 손상과 비교할 때 큰 비용이 아닙니다. 당신은 신화 기술을 가진 훌륭한 개발자가 될 수 있지만 동료가 있다고 생각할 수는 없습니다. KISS, 상황에 따라 물건을 싸서 다른 사람들이 최대한 쉽게 만들 수 있습니다.
Maciej Tokarz

@senderle 이것을 제어하는 ​​eslint 규칙은 여기에서 찾을 수 있습니다 : eslint.org/docs/rules/curly#multi /*eslint curly: ["error", "multi"]*/
silkfire

15

기술적으로는 아니지만 그렇지 않으면 절대적으로 그렇습니다 !!!

"개인 취향", "코드가 제대로 실행", "나를 위해 잘 작동했습니다", "더 읽기 쉬운", yada yada BS를 잊어 버리십시오. 실수를하고 코딩 할 때 실수를 저지르는 것이 매우 쉽다고 생각하면 이것은 매우 심각한 문제로 이어질 수 있습니다 (믿지 마십시오?, 유명한 Apple이 버그에 실패 하는 것을 확인하십시오) ).

주장 : "개인 취향"

전혀 그렇지 않다. 당신이 화성으로 떠나는 한 남자 팀이 아니라면 대부분의 경우 다른 사람들이 코드를 읽거나 수정합니다. 심각한 코딩 팀에서는 이것이 권장되는 방법이므로 '개인 취향'이 아닙니다.

인수 : "코드가 제대로 실행됩니다"

스파게티 코드도 마찬가지입니다! 생성해도된다는 의미입니까?

주장 : "그것은 나에게 잘 작동했다"

내 경력 에서이 문제로 인해 너무 많은 버그가 발생했습니다. 'DoSomething()''SomethingElse()'전화를 받았는지에 대해 몇 번이나 논평 하고 당황 했는지 기억하지 못할 것입니다 .

if (condition) 
    DoSomething();
SomethingElse();

또는 'SomethingMore'를 추가했지만 들여 쓰기가 다른 것을 암시하더라도 호출되지 않는 것을 보지 못했습니다.

if (condition)
  DoSomething();
  SomethingMore();

여기 내가 가진 실제 사례가 있습니다. 누군가가 모든 로깅을 해제하여 find & replace "console.log"=>를 실행하려고했습니다 //"console.log".

if (condition) 
   console.log("something");
SomethingElse();

문제가 보입니까?

"이것은 너무나 사소한 일이지만 결코 그렇게하지 않을 것입니다."라고 생각하더라도; 당신보다 프로그래밍 기술이 열등한 팀원이 항상 있다는 것을 기억하십시오.

인수 : "더 읽기 쉽다"

프로그래밍에 대해 배운 것이 있다면 간단한 것들은 매우 빠르게 복잡해집니다. 이것은 매우 일반적입니다 :

if (condition) 
    DoSomething();

다른 브라우저 / 환경 / 사용 사례로 테스트되거나 새로운 기능이 추가 된 후 다음으로 바뀝니다.

if (a != null)
   if (condition) 
      DoSomething();
   else
      DoSomethingElse(); 
      DoSomethingMore();
else 
    if (b == null)
         alert("error b");
    else 
         alert("error a");

그리고 이것을 이것과 비교하십시오 :

 if (a != null) {
    if (condition) { 
       DoSomething();
    }
    else {
       DoSomethingElse();
       DoSomethingMore();
    }
 } else if (b == null) {
    alert("error b");
 } else {
    alert("error a");
 }

추신 : 보너스 포인트는 위의 예에서 버그를 발견 한 사람에게 전달됩니다.


2
명백한 버그는 DoSomethingMore ()입니다. 그러나 또 다른 버그가 있습니다. a가 null이고 b가 null이면 "error b"만 표시되고 "error a"는 표시되지 않습니다.
로켓은 빠르다

예를 들어, 개발 팀은 코드 작성 방법을 전혀 모릅니다. 중괄호는 도움이되지 않습니다 ...
Carlos ABS

일부 예제는 Apple 개발자 팀에서 제공 한 것입니다
Caner

13

유지 보수성 문제가 없습니다!

여러분 모두의 문제는 모든 곳에 세미콜론을 두는 것입니다. 여러 명령문에 중괄호가 필요하지 않습니다. 문장을 추가하려면 쉼표 만 사용하십시오.

if (a > 1)
 alert("foo"),
 alert("bar"),
 alert("lorem"),
 alert("ipsum");
else
 alert("blah");

이것은 예상대로 실행되는 유효한 코드입니다!


2
당신은 의미하지 않는다 if, else그리고 alert이 아니라 If, ElseAlert?
Anish Gupta

와우, 나는 이것을 몰랐다. 대부분의 사람들이이 중요한 세부 사항을 생략 한 것 같습니다.
Hendeca

13
이것은 JavaScript에서 작동하지만 왜 그렇게하고 싶습니까? 나는 대부분의 개발자가 이것을 알지 못한다고 추측하고 있습니다 (이것은 읽기 전에 내 자신이 포함되어 있습니다). 때로는 가장 영리한 방법이 최선이 아닙니다.
Simon

14
이것은 끔찍하다. 누군가가 문장을 추가하고 블록의 두 번째에서 마지막 문장에 세미콜론을 쉼표로 바꾸는 것을 잊어 버린 경우 줄 끝의 쉼표와 세미콜론도 너무 길어지기 때문에 실제로 발견하기 어려운 버그가 있습니다. 비슷한.
Ingo Bürk

1
나는 "Hemingwayian"접근 방식을 선호합니다 : 매우 깨끗합니다. 그리고 사이 공간없이 if(같은if(true) doSomething();
victorf

8

한 줄 문장에 중괄호를 사용해야하는 프로그래밍 이유는 없습니다.

이것은 코더 환경 설정과 가독성에만 달려 있습니다.

코드가 손상되지 않습니다.


7

@Josh K (Java, C 등에 적용됨)에서 언급 한 이유 외에도 JavaScript의 특별한 문제 중 하나는 자동 세미콜론 삽입 입니다. Wikipedia 예제에서 :

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

따라서 다음과 같이 사용하면 예기치 않은 결과가 발생할 수도 있습니다.

if (x)
   return
   a + b;

쓰는 것이별로 좋지 않습니다.

if (x) {
   return
   a + b;
}

그러나 어쩌면 여기서 오류가 조금 더 쉽게 감지 될 수 있습니까 (?)


작가들이 일시적으로 지불하거나 한 줄씩 또는 일할 때까지 지불하지 않는 한, 이러한 모든 예는 나에게 끔찍한 것처럼 보입니다.
Cees Timmerman


4

좋은 답변이 많이 있으므로 중괄호를 생략 할 수있을 때 내 규칙을 말하는 것을 제외하고는 반복하지 않습니다. '반환'또는 '투구'(예 :)와 같은 유일한 조건 . 이 경우 흐름 제어는 이미 종료되고 있음이 분명합니다.

종료 흐름 제어로 인해 "나쁜 경우"조차도 신속하게 식별 (고정) 될 수 있습니다. 이 개념 / 구조“규칙”은 여러 언어에도 적용됩니다.

if (x)
    return y;
    always();

물론, 이것이 린터를 사용하는 이유이기도합니다.


3

추천되는 이유는 다음과 같습니다.

내가 쓴다고합시다

if(someVal)
    alert("True");

다음 개발자가 와서 "아, 다른 일을해야 해요"라고 말합니다.

if(someVal)
    alert("True");
    alert("AlsoTrue");

보시다시피 "AlsoTrue"는 항상 사실입니다. 첫 번째 개발자는 중괄호를 사용하지 않았기 때문입니다.


맞지 않습니다. 'else'가 누락되었습니다. if (someVal) alert ( "True"); else alert ( "AlsoTrue"); 맞을 것입니다. {}이 훨씬 더 읽기 쉽기 때문에 사용하지 않을 것입니다.
Gerrit B

1
응? else 선언이 없었습니다. 중괄호가 없으면 누군가 새로운 줄을 추가하면 버그가 발생할 수 있다고 말하고있었습니다. 내 요점을 이해하지 못했다고 생각합니다.
Amir Raminfar

그가 말하는 것은 두 번째 줄이 무엇이든 실행된다는 것입니다. 중괄호가없는 If 문은 한 줄만 실행할 수 있습니다.
PostCodeism

3

나는 현재 축소 기에서 일하고 있습니다. 지금도 두 개의 큰 스크립트에서 확인합니다. 실험적으로 내가 알아 냈습니다 : 중괄호에 ';', 'return', 'for', 'if', 'else'가 포함되어 있지 않으면 함수 중 *에 대해 중괄호를 제거 할 수 있습니다. 'while', 'do', 'function'입니다. 무관 한 줄 바꿈.

function a(b){if(c){d}else{e}} //ok  
function a(b){if(c)d;else e}   //ok

물론 닫는 중괄호가 뒤에 나오지 않으면 닫는 중괄호를 세미콜론으로 바꿔야합니다.

함수는 쉼표로 끝나서는 안됩니다.

var a,b=function()c;  //ok *but not in Chrome
var b=function()c,a;  //error  

Chrome 및 FF에서 테스트되었습니다.


2

항상 그것을 발견

if(valid) return;

내 눈보다 쉬워

if(valid) {
  return;
}

또한 조건부와 같은

(valid) ? ifTrue() : ifFalse();

읽기보다는 내 개인적인 의견이 더 쉽다

if(valid) {
  ifTrue();
} else {
  ifFalse();
}

하지만 코딩 스타일에 달려 있다고 생각합니다.


2

질문에 직접 응답하지 않지만 아래는 한 줄의 if 조건에 대한 간단한 구문입니다.

전의:

var i=true;
if(i){
  dosomething();
}

다음과 같이 쓸 수 있습니다 :

var i=true;
i && dosomething();

1

자바 스크립트에는 많은 문제가 있습니다. JavaScript 설계자 Douglas Crockford를 살펴보십시오 . if 문은 문제가 없지만 return 문은 문제를 일으킬 수 있습니다.

return
{
    ok:false;
}
//silent error (return undefined)

return{
    ok:true;
}
//works well in javascript

1

이 답변이 비슷한 경험을 검색하는 것을 발견했기 때문에 내 경험으로 답변하기로 결정했습니다.

대괄호없는 명령문은 대부분의 브라우저에서 작동하지만, 대괄호없는 메소드는 실제로 일부 브라우저에서는 작동하지 않는 것으로 테스트되었습니다.

2018 년 2 월 26 일부터이 설명은 Pale Moon에서는 작동하지만 Chrome에서는 작동하지 않습니다.

function foo()
   return bar;

0

명령문의 시작 들여 쓰기 레벨은 그 위에있는 열린 중괄호 수와 같아야합니다. (따옴표 또는 주석 처리 된 중괄호 또는 전 처리기 지시문의 중괄호 제외)

그렇지 않으면 K & R은 들여 쓰기 스타일이 좋습니다. 스타일을 고치려면 간단한 간단한 if 문을 한 줄에 배치하는 것이 좋습니다.

if (foo) bar();    // I like this. It's also consistent with Python FWIW

대신에

if (foo)
   bar();   // not so good

편집기를 작성하는 경우 자동 형식 버튼을 사용하여 막대를 foo와 같은 줄로 빨리 게 만들고 다음과 같이 전에 return 키를 누르면 막대 주위에 중괄호를 삽입합니다.

if (foo) {
  bar();    // better
}

그런 다음 if 문의 본문 내에서 막대 위 또는 아래에 새 명령문을 추가하는 것이 쉽고 일관됩니다.

if (foo) {
  bar();    // consistent
  baz();    // easy to read and maintain
}

-1

때때로 그들은 필요한 것 같습니다! 나는 그것을 스스로 믿을 수 없었지만 어제 Firebug 세션 (최근 Firefox 22.0)에서 나에게 발생했습니다.

if (! my.condition.key)
    do something;

실행 뭔가 할 에도 불구하고 my.condition.key가 있었다 true . 중괄호 추가 :

if (! my.condition.var) {
    do something;
}

그 문제를 해결했습니다. 중괄호없이 분명히 작동하는 수많은 예가 있지만이 경우 분명히 그렇지 않습니다.

한 줄에 둘 이상의 진술을하는 경향이있는 사람들은 반드시 은 물론 중괄호를 사용해야합니다.

if (condition)
    do something; do something else;

찾기가 어렵습니다.


중괄호가 부족하여 if 조건을 충족시킨 시나리오가 무엇인지 궁금합니다. 기억 나거나 실제 사례를 제시 할 수 있습니까?
gitsitgo

조건식은 항상 명령문보다 먼저 평가됩니다. 또한 인터프리터의 버그를 나타 내기 때문에 실제 예제를 보는 것이 매우 흥미 롭습니다.
세미콜론

-1

나는 중괄호를 다른 것에 버려 둘 수 있음에 유의하고 싶습니다. 이 기사 에서 볼 수 있듯이 John Resig 's .

if(2 == 1){
    if(1 == 2){
        console.log("We will never get here")
    }
} else 
    console.log("We will get here")

[Qt braces style] [1]은 else괄호 사용법과 일치하도록 양쪽에 블록 이 필요합니다.이 예 else에서는 코드 검토를 통과하기 위해 블록에 괄호가 필요합니다 . [1] : wiki.qt.io/Qt_Coding_Style#Braces
pixelgrease

왜 공감해야합니까? 위의 진술은 100 % 정확합니다.
Johnston

-1

if statement .. (Wow what english ..) 여러 줄의 중괄호를 달성하는 방법이 있지만 다소 테디 우스입니다.

if(true)
   funcName();
else
   return null;


function funcName(){
  //Do Stuff Here...
}

중괄호를 생략 할 때 새로운 줄을 많이 가질 필요는 없습니다. 위의 내용은 다음 if (true) funcName()과 같이 두 줄로 작성할 수도 있습니다. else return null
phobos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.