제어문은 조건에 따라 코드블록을 실행하거나 반복 실행할 때 사용한다. 제어문을 사용하면 코드의 실행 흐름을 인위적으로 제어할 수 있다. 하지만 코드의 실행 순서가 변경된다는 것은 직관적인 코드의 흐름을 혼란스럽게 만든다. 가독성을 해치는 단점이 있다.
forEach, map, filter, reduce 같은 고차 함수를 사용한 함수형 프로그래밍 기법에서는 제어문의 사용을 억제하여 복잡성을 해결한다.
블록문은 0개 이상의 문을 중괄호로 묶은 것이다. 자바스크립트는 블록문을 하나의 실행 단위로 취급한다. 블록문은 문의 종료를 의미하는 자체 종결성을 갖기 때문에 블록문의 끝에는 세미콜론을 붙이지 않는다는 것이다.
조건문은 주어진 조건식의 평가 결과에 따라 블록문의 실행을 결정한다.
주어진 조건식(불리언 값으로 평가될 수 있는 표현식)의 평가 결과에 따라 실행할 코드 블록을 결정한다. if문의 조건식은 불리언 값으로 평가되어야 한다. 불리언값이 아닌 값으로 평가되면 자바스크립트 엔진에 의해 암묵적으로 불리언 값으로 강제 변환된다.
if (조건식1) {
// 조건식1이 참이면 이 코드 블록이 실행된다.
} else if (조건식2) {
// 조건식2가 참이면 이 코드 블록이 실행된다.
} else {
// 조건식1과 조건식2가 모두 거짓이면 이 코드 블록이 실행된다.
}
else if 문만 여러번 사용할 수 있다. 만약 코드 블록 내의 문이 하나뿐이라면 중괄호를 생략할 수 있다. 삼항 조건 연산자로 바꿔 쓸 수 있다.
if...else 문은 표현식이 아닌 문이다. 값처럼 사용할 수 없기 때문에 변수에 할당할 수 없다.
주어진 표현식을 평가하여 그 값과 일치하는 표현식을 갖는 case 문으로 실행 흐름을 옮긴다. case 문은 상황을 의미하는 표현식을 지정한다. 표현식과 일치하는 case 문이 없다면 실행 순서는 default 문으로 이동한다. default 문은 선택사항이다.
switch 문의 표현식은 불리언 값보다는 문자열이나 숫자 값인 경우가 많다. 다양한 상황(case)에 따라 실행할 코드 블록을 결정할 때 사용한다.
const month = 11;
const monthName;
switch (month) {
case 1: monthName = '1월';
break
case 2: monthName = '2월';
break
case 3: monthName = '3월';
break
case 4: monthName = '4월';
break
case 5: monthName = '5월';
break
case 6: monthName = '6월';
break
case 7: monthName = '7월';
break
case 8: monthName = '8월';
break
case 9: monthName = '9월';
break
case 10: monthName = '10월';
break
case 11: monthName = '11월';
break
case 12: monthName = '12월';
break
default: monthName = 'Invalid month'
}
console.log(monthName); // 11
default문에는 break 문을 생략하는 것이 일반적이다. default 문의 실행이 종료되면 switch 문을 빠져나간다.
반복문은 조건식의 평가 결과가 참인 경우 코드 블록을 실행한다. 그 후 조건식을 다시 평가하여 여전히 참인 경우 코드 블록을 다시 실행하고 거짓일 때까지 반복한다.
조건식이 거짓으로 평가될 때까지 코드 블록을 반복 실행한다.
for (let i = 1; i >= 0; i--) {
console.log(i);
} // 1
for 문은 반복 횟수가 명확할 때 주로 사용하고 while 문은 반복 횟수가 불명확할 때 주로 사용한다. 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 강제 변환하여 논리적 참, 거짓을 구별한다.
const count = 0;
while (count < 3) {
console.log(count); // 0 1 2
count++;
}
코드 블록을 먼저 실행하고 조건식을 평가한다. 코드 블록은 무조건 한 번 이상 실행된다.
break 문은 레이블 문(식별자가 붙은 문), 반복문 또는 switch 문의 코드 블록을 탈출한다.
반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동시킨다. break 문처럼 반복문을 탈출하지는 않는다.
for (const i = 0; i < string.length; i++) {
if (string[i] !== search) continue;
count++;
}
if 문에서 실행해야 할 코드가 한 줄이라면 쓰지 않는게 가독성에 좋다.