이제 IAT 시험이 2주가 채 안 남았다...!
사실 기다리느라 목 빠지는(?)...생략...🤣
하면서 생각나는걸 야금야금...? 적어보려고 한다!
예~전에 이유를 알았는데 까먹어서 이유없이 사용하지 않고 있었다.
JavaScript에서는 배열도 객체이므로 for...in
순회가 가능하다.
하지만 아래와 같은 경우에 의도치 않은 순회가 발생하기 때문에 사용하지 않는다.
배열의 prototype
에 메소드를 추가했는데 data
의 순회에서 출력이 된다!
const data = [1, 2, null, '3', '4', undefined, ""];
for(const i in data) console.log(data[i]);
// 1 2 null '3' '4' undefined ""
Array.prototype.getValue = function () {};
for(const i in data) console.log(data[i]);
// 1 2 null '3' '4' undefined "" function (){}
*** 댓글 답변 추가 : 객체 또한 의도치 않은 순회가 발생할 수 있습니다!
prototype의 유무를 잘 확인하고 사용하도록 해야 합니다...! 👀
const obj_data = {a: 1, b: '2'}
Object.prototype.getValue = function () {}
for(const i in obj_data) console.log(obj_data[i])
// 1 '2' function (){}
간단한 recursion 몇 문제를 풀면서 감을 익히자...👀
"0! = 1", "1! = 1"
인것만 알면 쉽다.
// factorial
const fact = n => n < 2 ? n : n * fact(n - 1)
log(fact(5)) // 24
"n - 2 + n - 1 = n"
을 이용한다. 3가지 방법을 제시한다.
1, 2, 3 셋 다 recursion 방식은 같다. 과정이 약간씩 다를뿐.
// 1. fibo1
const fibo1 = n => n < 2 ? n : fibo(n - 1) + fibo(n - 2);
log(fibo1(15)) // 610
// 2. fibo2
const fibo2 = n => {
if (n < 2) return n;
if (!(n in fibo2)) {
fibo2[n] = fibo2(n - 1) + fibo2(n - 2);
}
return fibo[2];
}
log(fibo2(15)) // 610
// 3. fibo3
const memorize = f => {
let caching = {};
return function(x) => {
caching[x] === undefined && caching[x] = f(x);
return caching[x]
}
}
const fibo3 = memorize(n => n < 2 ? n : fibo3(n - 1) + fibo3(n - 2));
log(fibo3(15)) // 610
learnCo 79번 문제이다. 문자를 n만큼 반복하면 된다.
// 1. non-recursion
const repeatString = (str, n) => n <= 0 ? '' : str.repeat(n);
log(repeatString('code', 3)) // codecodecode
// 2. recursion
const repeatString = (str, n) => {
if (n <= 0) return '';
return n === 1 ? str : str + repeatString(str, n - 1);
}
log(repeatString('banana', 3)); // bananabananabanana
piazza에서 누가 질문하길래 나도 심심해서 만들어보았다! 🤟🏻
기본값으로 0 을 주어서 에러를 막았고,
end
가 start
보다 클때는 값을 교환한다.
return값이 배열이기때문에 전개연산자로 recursion을 받을 수 있다.
const range = (start = 0, end = 0) => {
let arr = [];
start > end && ([start, end] = [end, start]);
arr.push(start);
return start === end ? arr : [...arr, ...range(start + 1, end)]
}
console.log(range(2, 5)); // [2, 3, 4, 5]
모르고 있었는데 감사해요 완전 생소한 개념이라 찾아보니까 추가적인 참고할만한 것들이 있었어요. 공유합니다
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties
https://stackoverflow.com/questions/3010840/loop-through-an-array-in-javascript
for ... in 을 사용하는건 object array에서 둘다 조심해야하고 hasOwnProperty로 먼저 prototype이 가지는 건지 아닌지 판단해주고 사용해야할 것 같군요