Skip to content
This page has been auto-translated and may contain errors.View in English

조건문

docs.scrimba.com

항상 똑같은 일만 하는 프로그램은 쓸모가 별로 없습니다. 로그인한 방문자에게는 한 가지 메시지를 보여주고 낯선 사람에게는 다른 메시지를 보여주는 페이지, 18세는 통과시키지만 12세는 통과시키지 않는 폼, 이기고 졌는지를 알려주는 게임이 필요할 때가 있습니다. 이런 것들은 모두 질문을 던지고 그 답에 따라 행동하는 방법이 필요합니다. 조건문이 바로 그런 역할을 합니다. 조건문을 사용하면 어떤 것이 참인지에 따라 코드가 무엇을 실행할지 선택할 수 있습니다.

필요한 재료는 이미 갖고 있습니다. 비교 연산자와 논리 연산자가 참 또는 거짓의 답을 만들어내고, 이 장에서는 그 답에 따라 행동하는 방법을 다룹니다.

조건이 참일 때만 코드 실행하기

**if문**은 조건이 참일 때만 코드 블록을 실행합니다. if라는 단어를 쓰고, 괄호 안에 조건을 적고, 중괄호 안에 실행할 블록을 작성합니다. 조건이 참이면 블록이 실행됩니다. 참이 아니면 JavaScript는 블록을 건너뛰고 다음으로 넘어갑니다.

js
const age = 20;

if (age >= 18) {
  console.log("You can enter."); // You can enter.
}

age >= 18이라는 조건은 참이거나 거짓입니다. 여기서는 age가 20이므로 참이 되어 메시지가 출력됩니다. age를 12로 바꾸면 조건이 거짓이 되어 블록이 건너뛰어지고 아무것도 출력되지 않습니다.

조건이 거짓일 때를 위한 대안이 필요한 경우가 많습니다. 이때 사용하는 것이 바로 else입니다:

js
const age = 12;

if (age >= 18) {
  console.log("You can enter.");
} else {
  console.log("Come back when you are older."); // Come back when you are older.
}

두 블록 중 정확히 하나만 실행되며, 둘 다 실행되는 경우는 없습니다. 결과가 두 가지보다 많을 때는 else if를 사용해 또 다른 조건을 확인할 수 있습니다:

js
const score = 74;

if (score >= 90) {
  console.log("Grade: A");
} else if (score >= 70) {
  console.log("Grade: B"); // Grade: B
} else {
  console.log("Grade: C");
}

JavaScript는 위에서부터 각 조건을 확인하며 처음으로 참이 되는 조건에서 멈춥니다. 74점은 >= 90은 아니지만 >= 70이므로 Grade: B가 출력되고, else는 확인하지 않습니다.

**if문**은 조건이 참일 때 블록을 실행하며, 선택적으로 조건이 거짓일 때 실행되는 else 블록을 붙일 수 있습니다. else if로 연결하면 여러 조건을 순서대로 확인할 수 있습니다.

js
const score = 74;

if (score >= 90) {
  console.log("Grade: A");
} else if (score >= 70) {
  console.log("Grade: B"); // Grade: B
} else if (score >= 50) {
  console.log("Grade: C");
} else {
  console.log("Grade: F");
}

순서가 중요한데, 많은 사람이 여기서 실수를 합니다. JavaScript는 위에서부터 각 조건을 검사하고 처음으로 참이 되는 조건의 블록을 실행한 뒤 나머지는 건너뛰습니다. 그래서 여기서는 범위를 높은 값에서 낮은 값 순서로 나열합니다. score >= 70에 도달하면 74가 이 조건과 일치해서 체인이 멈춥니다. 만약 score >= 50을 먼저 썼다면 74도 그 조건과 먼저 일치하게 되어, 50점 이상인 모든 사람이 C를 받게 됐을 것입니다.

조건에는 참 또는 거짓 값을 만들어내는 어떤 표현식이든 사용할 수 있으므로, 연산자에서 배운 논리 연산자로 여러 검사를 조합할 수 있습니다:

js
const age = 20;
const hasTicket = true;

if (age >= 18 && hasTicket) {
  console.log("Enjoy the show."); // Enjoy the show.
} else {
  console.log("Entry refused.");
}

**if문**은 조건을 평가해 결과가 참이면 블록을 실행하며, 나머지 경우를 위한 else ifelse 분기를 선택적으로 붙일 수 있습니다. 체인은 순서를 갖습니다. JavaScript는 위에서 아래로 조건을 평가해 처음으로 참이 되는 조건의 블록을 실행한 뒤 체인 전체를 빠져나갑니다.

js
const score = 74;

if (score >= 90) {
  console.log("Grade: A");
} else if (score >= 70) {
  console.log("Grade: B"); // Grade: B
} else if (score >= 50) {
  console.log("Grade: C");
} else {
  console.log("Grade: F");
}

이 구조에는 기억해 둘 만한 특성이 두 가지 있습니다. 첫째, 분기들은 서로 배타적이어서 정확히 하나만 실행됩니다. 그래서 여기서는 각 경계를 한쪽 방향으로만 걸어두면 충분합니다. score >= 70 분기에는 score < 90이라는 조건을 추가로 걸 필요가 없습니다. 이 줄에 도달했다는 것 자체가 이미 score >= 90 검사가 거짓이었다는 뜻이기 때문입니다. 이렇게 불필요한 상한을 추가하는 것은 흔히 나오는 습관이지만, 코드를 더 안전하게 만들어주기는커녕 읽기만 더 어렵게 만듭니다.

둘째, 조건은 불리언으로 강제 변환되므로 반드시 명시적인 비교식일 필요는 없습니다. 어떤 표현식이든 사용할 수 있고, JavaScript는 truthy·falsy 규칙을 적용해 판단합니다. 이런 유연함은 유용하지만 때로는 함정이 되기도 하는데, 이 부분은 이 장의 뒷부분에서 자세히 다시 다룹니다.

js
const age = 20;
const hasTicket = true;

if (age >= 18 && hasTicket) {
  console.log("Enjoy the show."); // Enjoy the show.
} else {
  console.log("Entry refused.");
}
Juno조건이 참일 때만 코드 실행하기if는 괄호 안 조건이 참일 때만 블록을 실행하고, else는 조건이 거짓일 때를 위한 대안을 제공합니다. 결과가 두 가지보다 많다면 else if를 추가하세요. JavaScript는 위에서부터 확인해 처음 일치하는 조건에서 멈추므로, 조건의 순서를 의미 있게 배치해야 합니다.
Juno조건이 참일 때만 코드 실행하기if / else if / else 체인은 처음으로 참이 되는 조건의 블록을 실행하고 나머지는 건너뛰므로, 순서는 장식이 아니라 로직입니다. 범위를 높은 값에서 낮은 값 순서로 나열하는 이유도 바로 이 때문입니다. 조건에는 참 또는 거짓으로 평가되는 어떤 표현식이든 사용할 수 있으므로, 필요하다면 논리 연산자로 여러 검사를 조합하세요.
Juno조건이 참일 때만 코드 실행하기 체인은 서로 배타적이며 위에서 아래로 평가되므로, 각 분기는 위쪽 분기들이 아직 배제하지 않은 경계만 확인하면 됩니다. 불필요한 상한을 추가하는 것은 신중해 보이지만 사실은 잡음일 뿐입니다. 그리고 조건은 불리언으로 강제 변환되는데, 이는 예상치 못한 값이 들어오기 전까지는 유용한 특성이므로 truthy·falsy 규칙을 항상 염두에 두세요.

삼항 연산자로 값 선택하기

때로는 if / else가 하는 일이 딱 하나, 두 값 중 하나를 고르는 것뿐인 경우가 있습니다. 이럴 때 쓰는 더 짧은 형태가 **삼항 연산자**입니다. 조건을 쓰고, ?를 쓰고, 참일 때 사용할 값을 쓰고, :를 쓰고, 거짓일 때 사용할 값을 씁니다.

js
const age = 20;
const message = age >= 18 ? "Welcome" : "Too young";

console.log(message); // Welcome

이것을 질문처럼 읽어 보세요. age >= 18인가요? 그렇다면 message"Welcome"이 되고, 그렇지 않다면 "Too young"이 됩니다. if / else가 내리는 것과 똑같은 결정을 한 줄로 표현한 것입니다.

삼항 연산자는 저장하거나 출력할 값을 고를 때 가장 빛을 발합니다. 한쪽 분기에서 여러 가지 일을 해야 한다면 if문이 더 명확하므로, 양쪽이 모두 단일 값일 때만 삼항 연산자를 사용하세요.

**삼항 연산자**는 조건에 따라 두 값 중 하나를 선택합니다: condition ? valueIfTrue : valueIfFalse. if문과 달리 삼항 연산자는 표현식이므로, 값을 만들어내어 변수에 대입하거나 템플릿 리터럴 안에 바로 넣을 수 있습니다.

js
const score = 82;
const passed = score >= 60 ? "pass" : "fail";

console.log(`Result: ${passed}`); // Result: pass

바로 이 점이 삼항 연산자의 가치입니다. 두 값 중 하나를 변수에 대입하는 일을 삼항 연산자는 한 줄로 처리하지만, if로 작성하면 같은 로직이 다섯 줄로 늘어나고 대입문이 양쪽 분기에서 반복됩니다:

js
// The if version does the same thing with more ceremony:
let passed;
if (score >= 60) {
  passed = "pass";
} else {
  passed = "fail";
}

삼항 연산자가 더 이상 도움이 되지 않는 지점은 분기가 값을 만드는 것 이상의 일을 할 때입니다. 어느 한쪽에서 여러 문장을 실행해야 하거나 삼항 연산자를 다른 삼항 연산자 안에 중첩하게 된다면, 얻었던 가독성은 사라집니다. 그럴 때는 if문이 더 명확한 선택입니다.

**삼항 연산자**는 JavaScript에서 피연산자를 세 개 받는 유일한 연산자입니다: condition ? valueIfTrue : valueIfFalse. 이 연산자를 유용하게 만드는 특징은 문이 아니라 표현식이라는 점입니다. 값으로 평가되기 때문에 문이 들어갈 수 없는 자리, 즉 대입문의 우변이나 인자, 템플릿 리터럴 안에도 들어갈 수 있습니다.

js
const score = 82;
const label = score >= 60 ? "pass" : "fail";

console.log(`Result: ${label}`); // Result: pass

할 일이 온전히 두 값 중 하나를 고르는 것뿐일 때 삼항 연산자를 사용하세요. 대입을 한 곳에 모아두고 양쪽 분기에서 반복하지 않아도 되므로 이럴 때는 if보다 삼항 연산자가 낫습니다. 삼항 연산자는 값을 고르기 위해 쓰는 것이지, 분기를 실행하기 위해 쓰는 것이 아닙니다.

실패하는 패턴은 중첩입니다. 분기 자체가 또 다른 삼항 연산자인 삼항 연산자는 기술적으로는 동작하지만, 읽는 사람이 오른쪽에서 왼쪽으로 파싱하며 여러 조건을 한꺼번에 머릿속에 담아야 하게 만듭니다:

js
// Hard to read. Prefer an if chain or a switch here.
const grade = score >= 90 ? "A" : score >= 70 ? "B" : score >= 50 ? "C" : "F";

이 한 줄은 올바른 답을 만들어내지만, 다음에 이 코드를 읽는 사람에게는 실제로 큰 노력을 요구합니다. 결과가 두 가지보다 많은 결정이라면 if 체인이나 switch가 훨씬 더 명확하게 표현하며, 이는 다음 절에서 다룹니다.

Juno삼항 연산자로 값 선택하기 삼항 연산자는 두 값 중 하나를 고르는 간결한 방법입니다: condition ? valueIfTrue : valueIfFalse. 저장하거나 출력할 값을 고를 때 특히 빛을 발합니다. 분기가 단일 값을 반환하는 것 이상의 일을 해야 한다면 대신 완전한 if를 사용하세요. 그러는 편이 더 명확하게 읽힙니다.
Juno삼항 연산자로 값 선택하기 삼항 연산자는 표현식이므로 변수에 대입하거나 템플릿 리터럴 안에 넣을 수 있는 값을 만들어내는데, 이는 if문으로는 할 수 없는 일입니다. 그래서 두 값 중 하나를 고를 때는 삼항 연산자가 깔끔한 선택입니다. if 버전은 양쪽 분기에서 대입문을 반복해야 하니까요. 분기가 실제로 여러 일을 하게 되거나 삼항 연산자를 중첩하기 시작한다면, 다시 if로 돌아가세요.
Juno삼항 연산자로 값 선택하기 삼항 연산자는 표현식이므로 문이 들어갈 수 없는 곳, 즉 대입문, 인자, 템플릿 리터럴에도 들어갈 수 있습니다. 분기를 실행하기 위해서가 아니라 값을 고르기 위해 사용하면 가독성이 유지됩니다. 서로 중첩하기 시작하면 더 이상 값어치가 없어지므로, 결과가 여러 개인 결정은 if 체인이나 switch에 맡기세요.

switch로 하나의 값을 고정된 케이스들과 비교하기

하나의 값을 정해진 여러 가지 가능성과 비교해야 할 때는 긴 if / else if 체인보다 **switch문**이 더 깔끔할 수 있습니다. 확인할 값을 지정한 다음, 그 값과 비교할 케이스들을 나열합니다.

js
const day = "Tue";

switch (day) {
  case "Sat":
    console.log("Weekend");
    break;
  case "Sun":
    console.log("Weekend");
    break;
  default:
    console.log("Weekday"); // Weekday
}

switchday를 각 case와 차례로 비교합니다. 일치하는 항목을 찾으면 그 case의 코드를 실행합니다. break는 여기서 멈추라는 뜻이고, 이것이 없으면 JavaScript는 계속 다음 case로 넘어가며 실행합니다. default는 어떤 case도 일치하지 않을 때 실행되는 대안으로, 체인의 마지막 else와 비슷한 역할을 합니다.

break를 빠뜨리는 것이 switch에서 가장 흔히 하는 실수입니다. break를 빼먹으면 일치한 case를 실행한 뒤 break나 끝에 도달할 때까지 그 아래의 모든 case를 계속 실행하게 되는데, 이는 거의 항상 의도한 바가 아닙니다.

**switch문**은 하나의 값을 정해진 여러 케이스와 비교합니다. 모든 분기가 같은 값의 동등성을 검사하는 경우라면 긴 if / else if 체인보다 더 명확하게 읽힙니다.

js
const status = "shipped";

switch (status) {
  case "pending":
    console.log("Order received.");
    break;
  case "shipped":
    console.log("On its way."); // On its way.
    break;
  case "delivered":
    console.log("Delivered.");
    break;
  default:
    console.log("Unknown status.");
}

이 로직을 구성하는 요소는 세 가지입니다. case는 일치시킬 값을 표시하고, break는 일치한 case를 끝내며, default는 일치하는 것이 없을 때를 처리합니다. 비교는 엄격한 동등 비교(===)를 사용하므로, case "1"은 숫자 1과 일치하지 않습니다.

여기서 조심해야 할 점은 fall-through입니다. break가 없는 case는 멈추지 않고, break나 switch의 끝에 도달할 때까지 실행이 계속 다음 case로 이어집니다. 대개는 버그이지만, 여러 case가 같은 결과를 공유할 때는 오히려 유용하게 쓰일 수 있습니다:

js
const day = "Sat";

switch (day) {
  case "Sat":
  case "Sun":
    console.log("Weekend"); // Weekend
    break;
  default:
    console.log("Weekday");
}

여기서는 "Sat"이 일치한 뒤 "Sun"을 위한 공유 블록으로 fall-through되어, 주말의 두 요일 모두 같은 줄을 실행합니다. 이것이 의도적으로 사용한 fall-through이며, 빈 case들이 공유 블록 바로 위에 나란히 쌓여 있기 때문에 명확하게 읽히는 것입니다.

**switch문**은 하나의 값을 받아 일련의 case 레이블과 비교하고, 처음으로 일치하는 case의 블록을 실행합니다. 비교는 엄격한 동등 비교(===)를 사용한다는 점이 중요합니다. case "1"은 숫자 1과 일치하지 않으며, 타입을 강제 변환해 구제해 주는 일도 없습니다.

js
const status = "shipped";

switch (status) {
  case "pending":
    console.log("Order received.");
    break;
  case "shipped":
    console.log("On its way."); // On its way.
    break;
  case "delivered":
    console.log("Delivered.");
    break;
  default:
    console.log("Unknown status.");
}

사람들이 과소평가하는 동작이 fall-through입니다. switch는 하나의 case를 실행하고 멈추는 것이 아니라, 일치하는 레이블로 점프한 뒤 break나 닫는 중괄호에 도달할 때까지 case 경계를 무시하며 곧장 아래로 실행을 이어갑니다. break가 빠지면 일치한 case 아래의 모든 case가 실행됩니다. 이것이 대부분의 switch 버그의 원인이며, 동시에 이 동작을 의도적으로 활용하는 유일한 경우이기도 합니다. 여러 값이 하나의 블록을 공유하도록 레이블을 나란히 쌓는 방식이 그 예입니다:

js
const day = "Sat";

switch (day) {
  case "Sat":
  case "Sun":
    console.log("Weekend"); // Weekend
    break;
  default:
    console.log("Weekday");
}

default가 반드시 마지막에 와야 하는 것은 아니지만, 마지막에 두는 것이 switch를 읽기 쉽게 유지하는 관례입니다. 또한 switch는 하나의 값에 대한 동등성만 검사하므로, 앞서 나온 성적 예시처럼 범위를 검사하는 체인은 switch로 바꿀 수 없다는 점도 기억해 두세요. 바로 이 한계가 switch가 언제 적합한 도구인지를 알려주는 기준이며, 이 등급의 마지막 부분에서 이 부분을 자세히 살펴봅니다.

Junoswitch로 하나의 값을 고정된 케이스들과 비교하기switch는 하나의 값을 여러 case 옵션과 비교해 일치하는 것을 실행하며, default가 그 무엇과도 일치하지 않을 때의 대안이 됩니다. 각 case는 항상 break로 끝내야 합니다. 그렇지 않으면 JavaScript는 아래에 있는 case들을 계속 실행합니다. 이 break 누락은 거의 누구나 한 번쯤은 저지르는 실수입니다.
Junoswitch로 하나의 값을 고정된 케이스들과 비교하기 모든 분기가 같은 값을 고정된 케이스들과 동등 비교하는 경우에는 switch를 사용하세요. 비교가 ===로 이루어진다는 점을 기억해야 합니다. 즉 "1"1이 아닙니다. 각 case는 break가 필요하며, 없으면 다음 case로 fall-through됩니다. 이 fall-through는 기본적으로는 버그지만, 빈 case들을 공유 블록 위에 쌓아둘 때만큼은 원하는 동작이 됩니다.
Junoswitch로 하나의 값을 고정된 케이스들과 비교하기switch는 하나의 값을 엄격한 동등 비교로 매칭한 다음, case 경계를 무시하고 break가 나올 때까지 아래로 계속 실행하므로, break가 빠지면 일치한 case 아래의 모든 case가 실행됩니다. 레이블을 공유 블록 위에 쌓아두는 것이 이 동작을 의도적으로 활용하는 유일한 경우입니다. 하나의 값에 대한 동등성만 검사하기 때문에, 범위를 검사하는 체인은 여전히 if 체인으로 남아야 합니다.

올바른 도구 선택하기

이제 결정을 내리는 세 가지 방법을 알게 되었고, 어떤 것을 선택할지는 상황에 얼마나 잘 맞는지에 달려 있습니다. 대부분의 분기, 특히 조건이 범위이거나 여러 조건의 조합일 때는 if / else if / else 체인을 사용하세요. 저장하거나 출력할 두 값 중 하나를 고를 때는 삼항 연산자를 사용하세요. 하나의 값을 몇 가지 고정된 선택지와 비교할 때는 switch를 사용하세요.

이 중 어느 것도 다른 것보다 더 고급이거나 뛰어난 것은 아닙니다. 여러분의 결정을 가장 명확하게 표현하는 것을 선택하세요. 확신이 서지 않는다면 if문이 언제나 안전한 기본 선택입니다.

세 가지 형태는 서로 겹치는 부분이 있으므로, 결정의 형태에 도구를 맞추는 감각이 중요합니다. if 체인은 무엇이든 처리할 수 있으며, 조건이 범위(score >= 70)이거나 조합(age >= 18 && hasTicket)일 때는 항상 올바른 선택입니다. 삼항 연산자는 하나의 표현식 안에서 두 값 중 하나를 고를 때 씁니다. switch는 status나 요일 이름처럼 하나의 값을 여러 고정된 케이스와 동등 비교할 때 어울립니다.

복잡하게 얽힌 코드를 많이 막아주는 한 가지 원칙이 있습니다. 가장 짧은 형태가 아니라 가장 명확하게 읽히는 형태를 선택하는 것입니다. 중첩된 삼항 연산자는 if 체인보다 짧지만 읽기는 더 어려우므로, 길이가 목표가 되어서는 안 됩니다. 목표는 다음에 이 코드를 읽을 사람, 흔히 한 달 뒤의 자신을 위한 명확함입니다.

세 가지 도구가 있고, 이들 사이의 경계는 결정의 형태로 결정됩니다. if 체인은 가장 일반적인 형태로, 범위와 조합, 조건으로 표현할 수 있는 모든 것을 다룰 수 있습니다. 그래서 분기들이 모두 하나의 값에 대한 동등성 검사가 아닌 경우에는 기본적으로 if 체인을 사용합니다. 삼항 연산자는 하나의 표현식으로 두 값 중 하나를 고르는 단 하나의 역할에 특화되어 있으며, 양쪽 분기가 단순함을 유지할 때만 제 값을 합니다. switch는 하나의 값을 고정된 케이스 집합과 동등 비교할 때 어울립니다.

여기서 다룰 범위는 아니지만 언급할 만한 네 번째 선택지도 있습니다. 값을 결과에 매핑할 때는 lookup 객체가 세 가지 도구를 모두 이기는 경우가 많습니다. case마다 값만 대입하는 switch나, value === "x" 검사를 반복하는 긴 if 체인은, 인덱스로 접근하는 평범한 객체로 표현하는 편이 훨씬 명확할 때가 많습니다. 객체를 배우게 되면 이 패턴을 마주치게 될 것입니다. 지금은 switch가 사실은 표를 흉내 내고 있는 경우를 알아채는 것만 기억해 두세요.

이 내용을 마무리하는 두 가지 고급 습관이 더 있습니다. 첫 번째는 truthy와 falsy 값입니다. 조건이 꼭 비교식이어야 할 필요는 없기 때문입니다. JavaScript는 조건을 불리언으로 강제 변환하는데, 거짓으로 판정되는 값은 정해진 짧은 집합뿐입니다: false, 0, ""(빈 문자열), null, undefined, NaN. 그 외의 모든 것은 참으로 취급됩니다. 그래서 if (name)이 "name이 비어 있지 않다"를 표현하는 흔한 축약형으로 쓰이는데, 동시에 이 때문에 예상치 못한 결과를 만나기도 합니다. 0은 진짜 숫자이지만 조건으로는 거짓이므로, count0일 때 if (count)는 블록을 건너뛰게 됩니다. falsy 집합을 알고 있으면 이런 검사가 더 이상 추측이 아니게 됩니다.

두 번째는 가드 클로즈(guard clause)입니다. 어떤 결정이 사실은 일찍 빠져나가는 것에 관한 것일 때는, 깊게 중첩된 if보다 종료 조건을 먼저 확인하고 멈추는 방식이 더 명확하게 읽힙니다. "안 좋은 경우를 먼저 확인해 멈추고, 그다음 정상적인 경로를 이어간다"는 이 형태가 바로 가드 클로즈이며, 주된 로직을 분기 속에 파묻지 않고 들여쓰기 없이 유지해 줍니다. 멈추는 부분은 대개 함수에서 빠져나가는 return을 의미하는데, 이는 다음 장인 함수에서 다루므로 전체 패턴은 그곳에서 완성됩니다. 지금 기억해 둘 아이디어는, 예외적인 경우를 먼저 처리해 결정을 평평하게 만드는 방식이 정상적인 경우를 점점 더 깊이 중첩시키는 것보다 거의 항상 더 명확하다는 점입니다.

Juno올바른 도구 선택하기 대부분의 결정에는 if 체인을 사용하고, 두 값 중 하나를 고를 때는 삼항 연산자를, 하나의 값을 고정된 선택지와 매칭할 때는 switch를 사용하세요. 어느 것도 다른 것보다 더 화려하거나 대단한 것은 아닙니다. 결정을 가장 명확하게 표현하는 것을 고르고, 확신이 없다면 기본적으로 if를 사용하세요.
Juno올바른 도구 선택하기 결정의 형태에 도구를 맞추세요. 범위와 조합에는 if, 두 값 중 하나를 고를 때는 삼항 연산자, 고정된 케이스에 대한 동등 비교에는 switch입니다. 가장 짧은 형태가 아니라 가장 명확하게 읽히는 형태를 선택하세요. 중첩된 삼항 연산자는 짧지만 따라가기 어렵습니다. 다음에 이 코드를 읽을 사람은 흔히 자기 자신이니, 그 사람을 위해 코드를 작성하세요.
Juno올바른 도구 선택하기if 체인은 범용 도구이고, 삼항 연산자는 두 값 중 하나를 고를 때 쓰며, switch는 고정된 집합에 대한 동등 비교에 씁니다. 객체를 배우고 나면 값을 매핑하는 switch보다 lookup 객체가 더 나은 경우가 많습니다. falsy 집합(false, 0, "", null, undefined, NaN)을 기억해 두면, count가 0일 때 그냥 if (count)만 썼다가 놀라는 일을 피할 수 있습니다. 그리고 결정이 사실은 일찍 빠져나가는 것에 관한 것이라면, 안 좋은 경우를 먼저 처리해 중첩을 평평하게 만드세요. 가드 클로즈의 전체 모습은 함수에서 완성됩니다.

조건문, 그 다음은?

조건문은 프로그램이 정해진 스크립트에 머무르지 않고 입력에 반응하도록 만들어주는 도구입니다. 조건문은 정말 자주 사용하게 되며, 주변의 다른 모든 것과 결합됩니다. 참 또는 거짓의 답은 연산자에서 나오고, 여기서 배운 결정들은 반복문으로 데이터에 대해 반복해서 실행하고 함수로 묶어낼 수 있게 되었을 때 진짜 힘을 발휘합니다.

다음 장인 반복문에서는 제어 흐름의 나머지 절반을 다룹니다. 코드를 실행할지 여부를 선택하는 것뿐 아니라, 조건이 멈추라고 알려줄 때까지 코드를 계속 반복해서 실행하는 방법입니다.