0707
ㅋㅋㅋㅋ아 겁나 망했다 ㅠㅠㅠㅠㅠ
여기에 문제 유형을 적을 순 없고..
6개월간 코테를 발로 풀었나보다
더 수련하자 ...... ㅎㅇㅌ ^^
js 기초
duplicate() 함수 구현
js
function duplicate(x, n) {
let result = [];
for (let i = 0; i < n; i++) {
result.push([...x]);
}
return result;
}
console.log(JSON.stringify(duplicate([1, 2, 3, 4, 5], 3)));
sum(1)(2); // 3
함수 구현
js
const sum = function (a) {
return function (b) {
return Number(a) + Number(b);
};
};
console.log(sum(1)(2));
- 클로저란, 함수의 리턴값을 함수로 주는 형태.
- 왜 필요한가?
- 자바스크립트에는
private
이 없기 때문에 클로저로 이를 흉내낼 수 있다. - 함수 실행이 끝나도 외부 함수의 변수를 내부함수가 계속 기억하기에 상태를 유지할 수 있다.
- 리액트의
useState
원리도 여기서 출발함.
- 리액트의
- 외부에서 a를 고정 시켜 새로운 함수를 만들어내는, 마치 함수 공장처럼 사용할 수 있다.
- 자바스크립트에는
- 왜 필요한가?
createBase
js
const createBase = function (x) {
return function addSix(r) {
return Number(x) + Number(r);
};
};
const addSix = createBase(6);
console.log(addSix(10));
- 함수 내부에서 선언한 function 이름은 함수 내부에서만 사용된다.
- 왜? 스코프가 있으니까.
- 왜 이렇게 만든걸까?
- 불필요한 변수가 외부에 노출되면 복잡성이 증가한다.
- 이런 경우가 언제 있을까?
- 퀴즈를 푸는 사이트가 있다고 가정하자.
- 이 때 답이 맞았는지, 틀렸는지 검증하는 함수를 전역에 선언한다면
사용자가 브라우저 콘솔창에 해당 함수에 어떤 값을 넣고 출력했을 때
이가 정답인지, 아닌지를 미리 알 수 있어 악용할 가능성이 생긴다.
- 이렇게 내부 스코프가 필요한 이유는 private 선언이 필요한 이유와도 귀결되며 이는 최종적으로 클로저의 필요성과 연결된다.
async/await
1번 출력 후 4s 후에 2번 출력하는 delay() 함수
js
function delay(sec){
return new Promise(res => setTimeout(res, sec * 1000));
}
async function main(){
console.log(`1번`);
await delay(4);
console.log(`2번`);
}
main();
중복 제거
Set 활용
js
const exampleArray = [4, 2, 9, 2, 4, 6, 8, 9];
console.log([...new Set(exampleArray)]);
filter && indexOf 활용
js
const exampleArray = [4, 2, 9, 2, 4, 6, 8, 9];
function removeDuplicate(arr){
return arr.filter((value, index) => {
return arr.indexOf(value) === index;
});
}
console.log(removeDuplicate(exampleArray));
- indexOf는 배열에서 해당 value가 처음으로 어느 인덱스에 등장했는지 반환
forEach 활용
js
const exampleArray = [4, 2, 9, 2, 4, 6, 8, 9];
function removeDuplicate(arr){
const res = [];
arr.forEach((value) => {
if (!res.includes(value)){
res.push(value);
}
});
return res;
}
console.log(removeDuplicate(exampleArray));