분류 | 제어구문 | 설명 |
---|---|---|
조건문 | 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
의 경우에도 똑같이 사용할 수 있다.