하지만! 코드의 실행 순서가 변경되는 것은 단순히 위에서 아래로 순차적이고 직관적인 코드의 흐름을 혼란스럽게 만든다.
따라서, 가독성을 해치는 단점이있다! 우리는 제어문을 올바르게 이해하고 사용해야한다!
//블록문
{
var
}
//제어문
var x = 1;
if(x < 10){
x++;
}
// 함수 선언문
function sum(a,b){
return a + b;
}
블록문은 언제나 문의 종료를 의미하는 자체 종결성을 갖기 때문에 블록문 끝에는 세미콜론을 붙이지 않는다.
if(조건식){
//조건식이 참이면 이 코드 블록이 실행된다.
}else{
//조건식이 거짓이면 이 코드 블록이 실행된다.
}
if(조건식1){
//조건식1이 참이면 이 코드 블록이 실행된다.
}else if(조건식2){
//조건식2가 거짓이면 이 코드 블록이 실행된다.
}else{
// 조건식1과 조건식2가 모두 거짓이면 이 코드 블록이 실행된다.
}
var num = 2;
var kind;
if(num > 0) kind = '양수';
else if(num < 0) kind = '음수';
else kind ='영';
console.log(kind); //양수
var x = 2;
var result;
if(x%2){
result = '홀수';
}else
result = '짝수';
}
//삼항연산자
var result = x%2 ? '홀수' : '짝수';
//3가지의 조건 삼항연산자
var kind = num ? (num > 0 ? '양수' : '음수') : '영';
조건에 따라 실행해야 할 내용이 복잡하여 여러 줄의 문이 필요하다면 if...else문을 사용하는 편이 가독성이 좋다.
switch(표현식){
case 표현식 1:
//switch 문의 표현식과 표현식1이 일치하면 실행될 문;
break;
case 표현식 2:
//switch 문의 표현식과 표현식2이 일치하면 실행될 문;
break;
default:
//switch 문의 표현식과 일치하는 case 문이 없을 때 실행될 문;
var num = 1;
var numName;
switch(num){
case 1: numName = '하나';
case 2: numName = '둘';
case 3: numName = '셋';
default: numName = '없음';
}
console.log(numName); //없음
var num = 1;
var numName;
switch(num){
case 1: numName = '하나';
break;
case 2: numName = '둘';
break;
case 3: numName = '셋';
break;
default: numName = '없음';
}
console.log(numName); //하나
반복문을 대체할 수 있는 다양한 기능도 있다.
배열을 순회할 때 사용하는 forEach메서드, 객체의 프로퍼티를 열거할 때 사용하는 for...in 문, ES6에서 도입된 이터러블을 순회할 수 있는 for...of문과 같이 반복문을 대체할 수 있는 다양한 기능을 제공한다.
for (변수 선언문 또는 할당문; 조건식; 증감식){
조건식이 참인 경우 반복 실행될 문;
}
for(var i = 0; i < 2; i++){
console.log(i);
}
// 0
// 1
//역반복 for문
for(var i = 1; i >= 0; i--){
console.log(i);
}
//1
//0
//무한 루프
for(;;){}
//for문의 변수 선언문, 조건식, 증감식은 모두 옵션이므로 반드시 사용할 필요는 없다!
//어떤 식도 선언하지 않으면 무한루프가 된다.
//중첩 for문
//for문 내에 for문을 중첩해서 사용할 수 있다.
for(var i = 0; i < 2; i++){
for(var i = 0; i < 2; i++){
if(i+j === 6) console.log(`[${i}, ${j}]`);
}
}
// [1,5]
// [2,4]
// [3,3]
// [4,2]
// [5,1]
var count = 0;
// count가 3보다 작을 때까지 코드 블록을 계속 반복 실행한다.
while(count < 3){
console.log(count); //0 1 2
count++;
}
//무한루프
//조건식의 평가 결과가 언제나 참이면 무한루프가 된다.
while(true){...}
//무한로프에서 탈출하기 위해서는 코드 블록 내에 if문으로 탈출 조건을 만들고 break문으로 코드 블록을 탈출한다.
while(true){
console.log(count);
count++;
//count가 3이면 코드 블록을 탈출한다.
if (count === 3) break;
} //0 1 2
var count = 0;
//count가 3보다 작을 때까지 코드 블록을 계속 반복 실행한다.
do{
console.log(count); //0 1 2
count++;
} while(count < 3);
// foo라는 레이블 식별자가 붙은 레이블 문
foo: console.log('foo');
// foo라는 식별자가 붙은 레이블 블록문
foo: {
console.log(1);
break foo; //foo 레이블 블록문을 탈출한다.
console.log(2);
}
console.log('Done!');
//문자열에서 특정 문자의 개수를 세는 예
var string = 'Hello World.';
var search = 'l';
var count = 0;
//문자열은 유사 배열이므로 for문으로 순회할 수 있다.
for (var i = 0; i < string.length; i++) {
//'l'이 아니면 현 지점에서 실행을 중단하고 반복문의 증감식으로 이동한다.
if(string[i] !== search) continue;
count++; //countinue문이 실행되면 이 문은 실행되지 않는다.
}
console.log(count); //3
//참고로 String.prototype.match 메서드를 사용해도 같은 동작을 한다.
const regexp = new RegExp(search, 'g');
console.log(string.match(regexp).length); //3
for (var i = 0; i < string.length; i++){
//'l'이면 카운트를 증가시킨다.
if (string[i] === search) count++;
}
//continue문을 사용하지 않으면 if 문 내에 코드를 작성해야함
for (var i = 0; i < string.length; i++){
//'l'이면 카운트를 증가시킨다.
if (string[i] === search){
count++;
//code
//code
//code
}
}
//continue 문을 사용하면 if 문 밖에 코드를 작성할 수 있다.
for (var i = 0; i < string.length; i++){
//'l'이 아니면 카운트를 증가시키지 않는다.
if (string[i] !== search) continue;
count++;
//code
//code
//code
}
}