지정한 조건이 참인 경우 명령문을 실행한다. 조건이 거짓인 경우 또 다른 명령문(else if, else)이 실행 된다.
순서 : if > else if > else
if (조건1) {
명령문1
} else if (조건2) {
명령문2
} else if (조건3) {
명령문3
...
} else
명령문N
switch
는 표현식을 평가하여, 그 값이 일치하는 case
문을 실행한다.
switch, case, break, default 의 키워드로 구성되어 있으며, 일반적으로 하나의 case만 실행되고 break로 끝맺는다.
switch (표현식) {
case value1:
명령문1
break;
case value2:
명령문2
break;
...
case valueN:
명령문N
break;
default:
명령문(보통은 아무것도 아닌 값에서 나오는 것을 출력)
break;
}
중간의 break가 없어지면 output은 그 다음 case문의 결과를 출력한다. 이미 그 전 case에서 조건을 true라고 판단하고 넘어갔기 때문에 그 다음 case의 조건은 안 보고 바로 결과를 수행하기 때문이다. (한마디로 break를 만나기 전에는 결과를 출력하지 않는 셈.)
for
문은 선언문, 조건문, 증감문으로 이루어져있다.(공백가능함) 중첩도 가능하다.
객체의 key, value 형태를 반복하여 수행할 때 좋다. 첫번째 부터 마지막까지 객체의 key개수만큼 반복한다.
for (variable in object) { ... }
collection 객체 자체가 반복 가능한 객체(symbol.iterator 속성을 가지고 있음)여야 동작이 가능하다.
ex) Array, Map, Set, String, TypedArray, arguments
for (variable of iterable) {
statement }
while
문은 조건문만 있으며 무한 loop 등에 활용된다.
while (조건문) {
statement
(무한 loop용이 아니라면 코드 중간에 조건 판단을 업데이트 해주는 문장을 넣기) }
do...while은 무조건 한 번은 수행을 한다.
do구문
while (조건문);
코드블록 탈출시 사용, 다중 반복문일 때는 가장 안쪽의 반복문을 종료시킨다.
function testBreak(x) {
var i = 0;
while (i < 6) {
if (i == 3) {
break;
}
i += 1;
}
return i * x;
}
label
(반복문 앞에 콜론과 함께 쓰이는 식별자)을 통해 다중 반복문을 한번에 종료도 가능하지만, 권장하지는 않는다.
코드블록 실행을 해당라인에서 중지하고 블록 코드를 종료시킨 후 반복문 내 명시된 조건판단으로 간다. (특정 조건일 때 뒷코드를 실행시키지 않고 싶을 때 사용한다.)
함수는 가급적 한 가지 일만 하고, 매개변수는 최대 3개 이내를 권장한다.
function add (x, y) {
return x + y;
}
const add = function (x, y) {
return x + y;
}
const add = (x, y) => x + y;
함수 스스로가 자신을 참조해 호출하면서 동일한 코드가 계속적으로 수행되는 함수 호출 방법
특정 조건시 그만 호출되는 exit code가 필요하다.
재귀함수는 console.log로 찍힐 때 가장 안쪽의 값부터 출력한다.
function recursive(num) {
if (num == 0) return 0;
retrun num + recursive(num - 1);
}
console.log(recursive(3)); //output : 6
function factorial(x) {
if (x === 0) return 1;
return x * factorial(x - 1);
}
const num = 3;
let result = factorial(num); //output : 6
다른 함수의 매개변수로 전달되어 수행되어지는 함수
고차함수(매개변수를 통해 함수를 받아 호출하는 함수)와 같이 많이 쓰인다.
//콜백함수
function add(x, y) {
return x + y;
}
function sub(x, y) {
return x - y;
}
function mul(x, y) {
return x * y;
}
function div(x, y) {
return x / y;
}
//고차함수
function calculator (callback, x, y) {
return callback(x, y);
}
console.log(calculator(add,7,3));//output : 10
값에 의한 복사로 함수 내에서 매개변수 값을 변경시켜도 원본에는 영향이 없다. (원시타입을 매개 변수로 넘겼을 때 발생)
주소에 의한 복사로 함수 내에서 매개변수 내 값을 변경시키면 원본데이터에도 영향이 있다. (객체 타입을 매개변수로 넘겼을 때 발생)
하나 이상의 함수를 매개변수로 취하거나 함수를 결과로 반환하는 함수
배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환한다. 정렬은 stable sort가 아닐 수 있다. (Number의 경우: 10보다 2가 더 크다고 판단됨. String의 경우: 대소문자를 구별하여 정렬함.)
따라서 숫자를 비교하고, 대소문자를 하나의 문자로 통일하는 등의 함수가 필요할 수도 있다.
let ascending_order = function (x, y) {
if (typeof x === "string") x = x.toUpperCase();
if (typeof y === "string") y = y.toUpperCase();//string일때, 다 대문자로 바꾸기
return x > y ? 1 : -1; //반환값이 1이면 y가 앞으로, 반환값이 -1이면 x가 앞으로, 0이면 그대로 있는다
};
let nums = [1, -1, 4, 0, 10, 20];
let str = ["orange", "Orange", "banana", "apple"];
console.log(nums.sort(ascending_order)); //[ -1, 0, 1, 4, 10, 20 ]
console.log(str.sort(ascending_order));//[ 'apple', 'banana', 'Orange', 'orange' ]
ascending_order라는 함수를 통해 nums와 str을 모두 사용가능 하게 만들었다. 이게 함수의 고용화이며, 깔끔한 코드를 위해 지향되어야한다.
붕어빵틀이라고 생각하면 된다. 유사한 객체를 다중으로 만들 때 사용되는 함수이다. 다른 언어에서는 class와 비슷하다고 한다. 일반적으로 첫글자를 대문자로 쓰며, 이걸로 객체를 생성할 때는 new
연산자로 객체를 생성해야한다.
여러 객체(entity)값을 순차적으로 나열한 자료구조이다. (알고리즘 내에서 사용 빈도가 높음) 배열 내 값을 요소(element)라고 하며, 배열 요소는 index로 접근 가능하다.
선언은 "new array()" or "[]"를 통해 선언하며, 사이즈나 값을 입력하여 초기화도 가능하다.
접근방법은 "array[index]"를 통해 index로 접근하며 1번째가 [0]이다.
배열속성은 "array.length"를 통해 배열 요소의 개수 확인이 가능하다.
- 배열 타입 확인 : array.isArray(value)
- 배열 추가/삭제(LIFO-Back: 맨뒤에 추가, 맨뒤 요소 삭제)
추가: array.push(element) 삭제: array.pop()- 배열 추가/삭제(LIFO-Front: 맨앞에 추가, 맨앞 요소 삭제)
추가: array.unshift(element) 삭제: array.shift()- 배열 삭제/변경(index)
array.splice(index[,deleteCount, element1, ... , elementN])- 배열 삭제(index)
array.slice([start],[end])- 다중배열병합
array.concat(arg1, arg ...)
array.splice의 사용법을 좀 더 자세히 설명하면
array.splice(1); //[1]을 포함한 그 뒤의 index를 삭제
array.splice(1,1);//[1]만 삭제
array.splice(1,1,"45","123"); //[1]을 삭제하고 "45"와 "123"을 추가
- for...length(index 접근)
- for...of(element 접근)
- for...in(key 접근)
- index탐색(앞에서부터): array.indexOf(item, from)
- index탐색(뒤에서부터): array.lastIndexOf(item, from)
- 값 포함 여부: array.includes(item, from)
- 오름차순(작>큰): array.sort()
- 내림차순(큰>작): array.reverse()
- 배열변환(배열값을 문자열로 변환): array.join(separator)
배열요소별 콜백함수 각각에 실행한다.
array.forEach(item(배열요소), index(배열위치), array(배열)){})
배열요소별 함수 호출 및 결과를 배열로 반환한다.
array.map(function(item, idex, array){})
콜백함수의 조건을 만족하는 "하나"의 값만 반환한다.
array.find(function(item, idex, array){})
콜백함수의 조건을 만족하는 값을 배열로 반환한다.
array.filter(function(item, idex, array){})
요소별 함수 수행 누적 결과값을 반환한다.
array.reduce(function(accumulator,item, idex, array){})
accumulator: 이전함수의 결과. initial로 초기값 설정 가능하며 여기에 결과가 누적된다. 초기값이 없다면 index[0]의 값을 가져온다. default가 0이기도 하며, 연산을 줄일려고 바로 가져오는 것이다.
let nums = [1, 2, 3, 4, 5];
let call_count = 0;
console.log("result\tvalue\tindex");
let sum = nums.reduce(
function (accumulator, item, index, array) {
console.log(accumulator, "\t", item, "\t", index);
call_count++;
return accumulator + item;
} /*여기가 initial 자리! 이곳이 비어있으면 index 1부터 시작한다.*/
);
console.log(call_count);
console.log(sum);
output
result value index
1 2 1
3 3 2
6 4 3
10 5 4
4
15