| 분류 | 제어구문 | 설명 |
|---|---|---|
| 조건문 | if/else, switch, try/catch/finally | 조건에 따라 분기 처리 |
| 반복문 | while, do/while, for, for/in, for/of | 조건을 만족하면 반복 실행 |
| 점프문 | break, continue, return, throw | 프로그램의 다른 위치로 이동 |
문법
if (조건식) {문장}
if (조건식) {문장1} else {문장 2}
예시
if(!name) {
name = "";
console.prompt("이름을 입력하세요");
} else {
console.log(`${name}`);
}
예시 2
if(a > b) {
if(a > c) {
console.log("a가 가장크다");
} else {
console.log("a는 b이하");
}
}
switch문의 경우 case 라벨은 분기의 시작을 명시할 뿐, 분기의 끝을 명시하지는 않으므로 case 라벨 이후 break문 필수default 라벨은 어떠한 case라벨과도 일치하지 않은 경우에 실행되는 문장case 라벨의 값은 항상 상수여야 하는데, Javascript 는 표현식!예시
function sayIt(n) {
switch(n) {
case 1:
console.log("1");
break;
case 2:
console.log("2");
break;
case "상수" + "아님":
console.log("case에 표현식도 가능");
break;
default:
console.log("기본");
}
}
sayIt(1); // -> "1"
sayIt(2); // -> "2"
sayIt("상수아님"); // -> "2"
sayIt("디폴트는"); // -> "기본"
문법
while (조건식) {문장}
continue, break 사용 가능true라면 반복, false라면 while문을 빠져나옴선형 검색 예제 (O(n)의 시간복잡도)
function linearSearch(x, a) {
var i = 0;
var n - a.length;
while(i < n && x > a[i]) i++;
if(x ==a[i]) return i;
return null
}
var a = [2, 4, 7, 12, 15, 21, 34, 35, 46, 57, 70, 82, 86, 92, 99];
console.log(linearSearch(35, a));
이진 검색 예제 ( log2(n) )
function binarySearch(x, a) {
var n = a.length;
var left = 0, right = n-1;
while(left < right) {
var middle = Math.floor((left + right) / 2);
if(x <= a[middle]) {
right = middle;
} else {
left = middle;
}
}
if(x == a[right]) return right;
return null
}
var a = [2, 4, 7, 12, 15, 21, 34, 35, 46, 57, 70, 82, 86, 92, 99];
console.log(binarySearch(35, a)); // -> 7
표현식의 판단을 마지막 부분에서 판단
do 문장 while(조건식);
팩토리얼 예제
function fact(n) {
var k = 1, i = n;
do {
k *= i--;
} while (i>0);
return k;
}
break, continue 사용가능문법
for (초기화 식; 조건식; 반복식) { 문장 }
true 라면 반복식 실행, false라면 다음 코드로예시
for(var i=0, sum=0, j=10;i<10;i++,j--){
sum += i;
console.log(i, sum, j); //j는 감소, i는 증가
}
중첩 반복문 예시 - 원의 n분점을 연결하는 직선 그리기
<head>
<meta charset="UTF-8">
<title>example</title>
<script>
function diamond(c, n, x, y, r, color) {
c.strokeStyle = color;
c.beginPath();
for(var i=0; i<n; i++) {
var t = i * 2 * Math.PI /n;
for(var j=i+1; j<n; j++) {
var s = j * 2 * Math.PI / n;
c.moveTo(x + r * Math.cos(t), y + r * Math.sin(t));
c.lineTo(x + r *Math.cos(s), y + r * Math.sin(s));
}
}
c.stroke();
}
window.onload = function() {
var canvas = document.getElementById("mycanvas");
var ctx = canvas.getContext("2d");
diamond(ctx, 18, 170, 170, 150, 'darkblue');
}
</script>
</head>
<body>
<canvas id="mycanvas" width=350 height=400></canvas>
</body>

객체안의 프로퍼티를 순환하는 반복문
for (변수 in 객체 표현식) {문장}
null 또는 undefined 일 경우 for/in문을 빠져나옴이외의 경우에는, 객체의 프로퍼티 이름이 차례대로 변수에 할당되고, 각각의 프로퍼티에 대해 문장이 한번 씩 실행됨.
var obj = {a:1, b:2, c:3};
for(var p in obj) {
console.log(`property ${p} 의 값은 ${obj[p]}`);
} // obj.p 로는 해당 프로퍼티에 접근이 불가능하다.
// -> property a 의 값은 1
// -> property b 의 값은 2
// -> property x 의 값은 3
라벨문 예시
loop1: while(true) {
if("종료") break loop1;
}
라벨문은 이중for문에서 한번에 모든 for문을 빠져나오는 상황에서 쓰일 수 있다.
loop: for(var i=0; i<10; i++) {
for(var j=1;j<10;j++){
console.log("something");
if(i == j) break loop; // 전체 반복문에서 빠져나옴
}
}
continue의 경우에도 똑같이 사용할 수 있다.