제어문
제어문을 사용하면 코드의 실행 흐름을 인위적으로 제어할 수 있다.
하지만 제어문은 코드의 흐름을 이해하기 어렵게 만들어 가독성을 해치는 단점이 있고,오류를 발생시키는 원인이 되기도 한다.
1.블록문
블록문은 0개 이상의 문을 중괄호로 묶은 것이다.
제어문이나 함수를 정의할 때 사용하는 것이 일반적이다.
//블록문
{
var foo = 10;
}
//제어문
var x = i;
if(x < 10) {
x++;
}
//함수 선언문
function sum(a,b) {
return a + b;
}
2.조건문
2-1. if ...else 문
if(조건식){
//조건식이 참이면 코드블록 실행
} else {
//조건식이 거짓이면 이 코드블록 실행
}
if 문의 조건식은 불리언 값으로 평가 되어야하며, 만약 불리언값이 아닐 경우 자바스크립트 엔진에 의해 암묵적 타입 변환을 해 boolean값으로 평가된다.
삼항 조건 연산자로 바꿔 쓸 수 있다.
var x = 2;
var result;
if(x % 2) {
return = "홀수";
} else {
return = "짝수";
}
console.log(result);
//다음과 같이 바꿔 쓸 수 있음
var result = x % 2 ? "홀수" : "짝수";
조건에 따라 단순히 값을 결정하여 변수에 할당하는 경우 if...else문 보다 삼항조건 연산자를 사용하면 가독성이 좋다.
하지만 내용이 복잡하여 여러줄의 문이 필요하면 if..else문을 사용하는 것이 가독성이 좋다.
2-2 switch 문
switch(표현식) {
case 표현식1:
switch 문의 표현식의 표현식1이 일치하면 실행될 문;
break;
case 표현식2:
switch 문의 표현식의 표현식2이 일치하면 실행될 문;
break;
default;
switch 문의 표현식과 일치하는 case문이 없을 때 실행될 문;
}
swich문의 표현식은 불리언 값보다는 문자열이나 숫자열인 경우가 많다.
따라서 다양한 상황에 실행할 코드 블록을 결정할 때 사용한다.
default문은 생략하는 것이 일반적이다.
폴스루(fall through) : break를 사용하지 않으면 실행흐름이 이동하여 문을 실행하고, 문을 탈출하지 않고 모든 문을 실행하여 마지막인 default를 출력한다.
3. 반복문
- forEach : 배열 순회시 사용
- for..in: 객체의 프로퍼티를 열거할 떄 사용
- for..of : ES6에서 도입된 이터러블을 순회할 수 있음
3-1. for문
for(;;) {...}
3-2. while 문
주어진 조건식의 평가 결과가 참이면 코드블록을 계속해서 반복실행한다.
평가 결과가 불리언 값이 아닌경우 강제 변환하여 참, 거짓을 구별한다.
반복 횟수가 명확하지 않을 때 주로 사용한다. 따라서 조건식의 평가 결과가 언제나 참이면 무한루프가 된다. 무한 루프를 탈출 하기 위해서는 코드 블록 내에 if문으로 탈출 조건을 만들고 break문으로 코드 블록을 탈출한다.
var count = 0;
while (cound < 3 ) {
console.log(count); //0 1 2
count++;
}
3-3. do...while문
코드블록을 먼저 실행하고 조건식을 평가한다.
따라서 코드블록은 무조건 한번 이상 실행된다.
let count= 4;
do {
console.log(count); // 4
count++;
console.log(count)l // 5
} while (count < 3);
3-4. break문
반복문, 스위치 문의 코드블록을 탈출 시에 사용한다
그 외의 문에서는 문법에러(SyntaxError)가 발생한다.
3-5.continue 문
반복문의 코드블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동시킨다.
break문 처럼 코드블록을 탈출하지 않는다.
let string = "Hello World.";
let seartch = 'l';
let count = 0;
for(let i = 0; i < string.length; i++) {
if(string[i] !== search) continue;
count++;
}
console.log(count); //3
const regxp = new RegExp(search, 'g');
console.log(string.match(regexp).length); // 3
for(let i = 0; i < string.length; i++) {
if(string[i] !== search) count++;
}