🔸 조건에 따라 분기 처리하는 명령 - if 명령
if(조건식) {
조건식이 true인 경우에 실행하는 명령
} else {
조건식이 false인 경우에 실행하는 명령
}
1) else 블록을 생략해도 무방하다.
2) else if 블록을 이용함으로써 복수의 분기 표시 가능
if(조건식) {
조건식이 true인 경우에 실행하는 명령
} else if(조건식2) {
조건식이 true인 경우에 실행하는 명령
}
...
} else {
조건식이 false인 경우에 실행하는 명령
}
var x = 30;
if (x >= 10) {
console.log('변수 x는 10 이상이다.');
} else if (X >= 20) {
console.log('변수 x는 20 이상이다.');
} else {
console.log('변수 x는 10 미만이다.');
} // 결과 : 변수 x는 10 이상이다.
➡ if 명령에서는 처음에 조건을 만족한 블록 한 개만 실행된다.
3) 중첩 구조 가능
: 제어 명령을 내부에서 중첩해서 사용 하는 것 - 네스트(Nest)
var x = 30;
if (x >= 10) {
if (X >= 20) {
console.log('변수 x는 20 이상이다.');
} else {
console.log('변수 x는 10 이상 20 미만이다.');
}
} else {
console.log('변수 x는 10 미만이다.');
// 결과 : 변수 x는 20 이상이다.
🔸 식의 값에 따라 분기 처리하는 명령 - switch 명령
: 동치 연산자에 의한 다중 분기 = 같은 조건식을 반복하지 않게 해주는 명령어
switch(식) {
case 값1:
'식 = 값1'인 경우에 실행되는 명령(군)
case 값2:
'식 = 값2'인 경우에 실행되는 명령(군)
...
default:
식의 값이 모든 값에 조건상 일치하지 않을 경우에 실행되는 명령(군)
}
1) 선두의 식이 우선 평가된다.
2) 위 1의 값에 일치하는 case 블록을 실행된다.
3) 일치하는 case 블록이 없을 경우에는 마지막의 default 블록을 호출한다. 단, default 구문은 필수가 아니지만 동작을 명확히 처리하기 위해서라도 생략해서는 안된다.
4) case 구문과 default 구문의 끝에는 반드시 현재의 블록으로부터 처리가 빠져 나오기 위한 제어 명령인 break 명령을 지정해야 한다.
var rank = 'B';
switch(rank) {
case 'A':
console.log('A랭크입니다.');
break;
case 'B':
console.log('B랭크입니다.');
break;
case 'C':
console.log('C랭크입니다.');
break;
default:
console.log('아무 랭크도 아닙니다.');
break;
} // 결과 : B랭크입니다.
예외로) 모든 값에 일치하는 블록을 표현하고 싶은 경우에 빈 case 블록을 열거
var rank = 'B';
switch(rank) {
case 'A':
case 'B':
case 'C':
console.log('합격!');
break;
case 'D':
console.log('불합격...');
break;
} // 결과 : 합격!
🔸 조건식에 따라 루프 제어하기 - while / do ~ while 명령
: 미리 부여된 조건식이 true인 동안은 루프를 반복한다.
while(조건식) {
조건식이 true일 때 실행되는 명령(군)
}
do {
조건식이 true일 때 실행되는 명령(군)
} while(조건식);
var x = 10;
while(x < 10) {
console.log('x의 값은 ' + x);
x++;
} // 결과 : x
var x = 10;
do {
console.log('x의 값은 ' + x);
x++;
} while(x < 10); // 결과 : x의 값은 10
➡ 루프를 시작할 때(전치판정 while)와 루프의 마지막(후치판정 do ~ while)에서 조건식을 판정 하기 때문에 루프가 시작되기 전부터 조건식이 false인 경우에 이러한 차이가 결과로 나타난다.
while 명령은 전치 판단 : 조건에 따라서는 1번도 루프를 실행하지 않는다.
do ~ while 명령은 후치 판단 : 조건에 상관없이 최소 1회는 루프 실행
🔸 지정 횟수만큼만 루프 처리하기 - for 명령
for (초기화 식; 루프 계속 조건식; 증감식) {
루프 내에서 실행하는 명령(군)
}
for (var x = 0; x < 5; x--) {...} // 무한 루프
for (;;) {...} // for 명령은 무조건 루프를 반복한다
🔸 연상 배열의 요소를 순서대로 처리하기 - for ~ in명령
: 지정된 연상 배열(객체)의 요소를 추출하여 선두부터 순서대로 처리하는 명령어
for (가변수 in 연상 배열) {
루프 내에서 실행하는 명령(군)
}
◽ 가변수 : 연상 배열(객체)의 키를 일시적으로 보관하기 위한 변수 - 인덱스 번호
var data = { apple:150, orange:100, banana: 120};
for (var key in data) {
console.log(key + '=' + data[key]);
} // 결과 : apple=150 orange=100 banana=120
🔸 배열 등을 순서대로 처리하기 - for ~ of명령
: ES2015에 추가된 명령이며 배열 뿐만아니라 Array, 반복자/생성자 등도 처리 할 수 있다. = 열거 가능한 객체
for (가변수 in 열거 가능한 객체) {
루프 내에서 실행하는 명령(군)
}
var data = [ 'apple', 'orange', 'banana' ];
Array.prototype.hoge = function () {}
for (var value in data) {
console.log(value);
} // 결과 : apple orange banana
➡ for ~ in명령은 가변수에 키명(인덱스 번호)이 건네진 것에 반해 for ~ of명령은 값을 열거하고 있다.
🔸 루프를 도중에 스킵/중단하기 - break/continue 명령
var result = 0;
for (var i = 1; i <= 100; i++) {
result += i;
if(result > 1000) { break; }
}
console.log('합계값이 1000을 넘은 것은 ' + i); // 결과 : 합계값이 1000을 넘은 것은 45
var result = 0;
for (var i = 1; i < 100; i++) {
if(i % 2 === 0) { continue; }
result += i;
}
console.log('합계: ' + result); // 결과 : 합계: 2500
➡ break 명령은 특정 조건을 만족하는 경우에 루프를 강제적으로 중단하고 루프 전체를 완전히 빠져나오는 명령어이고 continue명령은 현재의 루프만을 건너뛰고 다음 루프를 계속해서 실행하고 싶은 경우에 사용하는 명령어이다.
❕ 중첩된 루프를 한번에 빠져 나오기 ❕
for (var i = 1; i < 10; i++) {
for (var j = 1; j < 10; j++) {
var k = i * j;
if ( k > 30) { break; }
document.write(k + ' ');
}
document.write('<br />');
}
➡ 변수 k가 30이 넘은 경우에 break명령을 실행 한다. 이로 인해 안쪽 루프만을 빠져 나오고 있으므로 결과적으로 '곱셈값이 30 이하의 값만을 표시 하는 구구단' 프로그램을 만들었다.
kuku : // 레이블명 :
for (var i = 1; i < 10; i++) {
for (var j = 1; j < 10; j++) {
var k = i * j;
if ( k > 30) { break kuku; } // break 레이블명;
document.write(k + ' ');
}
document.write('<br />');
}
➡ 한 번 곱셈값이 30을 넘으면, 구구단 출력 자체를 정지 시키는 프로그램
🔸 예외 처리하기 - try ~ catch ~ finally 명령
: 스크립트 전체가 정지해버리는 일이 없도록 하는 것
try {
예외가 발생할지 모를 명령(군)
} catch (예외정보를 취할 변수) {
예외가 발생했을 시의 명령(군)
} finally {
예외의 유무에 관계없이 최종적으로 실행되는 명령(군)
}
1) 예외 발생시, 에러 정보는 catch 블록의 Error 객체(변수)로 인도된다. Error 객체에 준비되어 있는 message 프로퍼티를 사용하여 에러 메시지를 표시한다.
2) finally 블록은 불필요한 경우에 생략해도 상관없다.
3) 예외를 발생 시키는 것 = throw명령
throw new Error(에러 메시지)
var x = 1;
var y = 0;
try{
if (y === 0) { throw new Error('0으로 나누려고 하였다.'); }
var z = x / y;
} catch(e) {
console.log(e.message);
} // 변수 y가 0인 경우에 Error 객체를 생성하여 처리를 catch 블록으로 이동하도록 하고 있다.
catch 블록에는 throw된 Error 객체로부터 message 프로퍼티를 취득함
🔸 JavaScript의 위험한 구문 금지하기 - Strict 모드
: JavaScript의 함정을 발견하여 오류로 통지해주는 구조
분류 | Strict 모드에 의한 제한 |
---|---|
변수 | var 명령의 생략 금지 |
나중에 추가 예정인 키워드를 예약어로 추가 | |
인수/프로퍼티명의 중복 금지 | |
undefined/null로의 대입 금지 | |
명령 | with 명령의 이용 금지 |
arguments.callee 프로퍼티로의 액세스 금지 | |
eval 명령으로 선언된 변수를 주위의 스코프로 확산하지 않기 | |
그 외 | 함수 안의 this는 글로벌 객체를 참조하지 않는다 |
'0~'의 8진수 표기법은 금지 |
'use strict'; ①
function hoge() { ②
'use strict';
}
① 전체 스크립트가 Strict 모드
② 함수의 스크립트가 Strict 모드 = 제일 바람직한 표기법