
JavaScript는 애플리케이션에 다양한 상호작용을 추가하기 위한 일련의 명령문, 특히 제어 흐름 명령문을 지원한다.
가장 기초적인 명령문이다.
{
statement_1;
statement_2;
⋮
statement_n;
}```
제어흐름문(for while if 와 함께 사용된다.
```js
let x = 0;
while (x < 3) {
let y = x + 1; // ES6 이후, let과 const는 블록 스코프를 가진다.
console.log("반복 안에서 y:", y);
x++;
}
console.log("반복 밖에서 y:", y);
조건문은 지정한 조건이 참인 경우에 실행하는 명령 집합이다.
JavaScript는 if...else와 switch 두 종류의 조건문을 지원한다.
if 문은 조건이 참(true) 일 때 실행할 명령문을 지정함.else 절을 추가하면 조건이 거짓(false) 일 때 실행할 명령문을 지정할 수 있음.if (condition) {
statement_1;
} else {
statement_2;
}
condition → 불리언 값으로 평가되는 표현식statement_1, 거짓일 경우 statement_2 실행if (condition_1) {
statement_1;
} else if (condition_2) {
statement_2;
} else if (condition_n) {
statement_n;
} else {
statement_last;
}
항상 블록문 {} 사용하기
if (condition) {
statement_1;
statement_2;
} else {
statement_3;
statement_4;
}
→ 중첩된 if 문일수록 블록을 생략하지 않는 것이 가독성과 안전성에 좋음.
조건식에서 할당(=) 지양하기
if ((x = y)) {
/* ... */
}
==, ===)를 써야 의도를 명확히 표현 가능.falseundefinednull0NaN"" (빈 문자열)= > 이외의 값(객체, 배열, 문자열 "0" 등)은 모두 true 로 평가됨.
const b = new Boolean(false);
if (b) // true (객체는 truthy)
if (b == true) // false (비교 결과 다름)
Boolean 객체는 항상 truthy → 혼동하기 쉬움.true / false 와는 구분해야 함.ㄴ 원시값 true false와 Boolean객체는 왜 구분되어야 하는 개념인가?
function checkData() {
if (document.form1.threeChar.value.length == 3) {
return true;
} else {
alert(
"정확히 세 글자를 입력하세요. " +
`${document.form1.threeChar.value}은(는) 유효하지 않습니다.`
);
return false;
}
}
true 반환false 반환switch 문case 값과 일치하는 블록 실행.break를 만나면 switch 탈출. 없으면 fall-through 발생.default 절은 일치하는 case가 없을 때 실행 (위치 제약 없음).switch (fruit) {
case "사과":
console.log("사과 0.32$");
break;
case "바나나":
console.log("바나나 0.48$");
break;
default:
console.log("품절입니다");
}
throwthrow "Error";
throw 42;
throw new Error("메시지");
try...catchtry 블록 안에서 예외 발생 시 catch 블록으로 제어권 이동.catch는 던져진 예외를 식별자로 받아 처리.try {
riskyFunction();
} catch (e) {
console.error(e);
}
finallyfinally의 return 값이 try/catch의 return이나 throw보다 우선함.try {
openResource();
} catch (e) {
handleError(e);
} finally {
closeResource();
}
JS에서는 throw로 아무 값이나 던질 수 있는데,
이런 방식은 시스템(자바스크립트 엔진)이 던지는 에러와 개발자가 직접 던지는 에러를 구분하기 어려움.
해서 Error 생성자 사용을 권장함.
try {
throw new Error("메시지");
} catch (e) {
console.log(e.name); // "Error"
console.log(e.message); // "메시지"
}
for 문형식:
for ([초기문]; [조건문]; [증감문]) {
문장
}
초기문 → 조건 검사 → 문장 실행 → 증감문 → 반복.
조건이 거짓이면 종료. 조건을 생략하면 항상 참으로 간주.
do...while 문형식:
do {
문장
} while (조건문);
문장을 최소 1회 실행 후 조건 검사.
조건이 참이면 계속 반복, 거짓이면 종료.
while 문형식:
while (조건문) {
문장
}
조건을 먼저 검사 → 참이면 문장 실행, 거짓이면 종료.
조건이 항상 참이면 무한 루프 발생.
형식:
labelName: statement
루프에 이름(레이블)을 붙여 break나 continue가 특정 루프를 제어할 수 있게 함.
break 문switch, 레이블 문에서 사용.switch 종료.continue 문for...in 문형식:
for (variable in object) {
문장
}
객체의 열거 가능한 속성 이름(key) 을 반복.
배열 요소 순회에는 권장되지 않음(사용자 정의 속성도 반환하기 때문).
for...of 문형식:
for (variable of iterable) {
문장
}
반복 가능한 객체(iterable) 의 값(value) 을 순회.
배열, 문자열, Map, Set, arguments 등에서 사용.
for...in과의 차이: for...in은 key, for...of는 value 반복.