코드스테이츠 7주차

GunW·2019년 6월 18일
2

이제 IAT 시험이 2주가 채 안 남았다...!
사실 기다리느라 목 빠지는(?)...생략...🤣
하면서 생각나는걸 야금야금...? 적어보려고 한다!


1. for..in... 왜 배열에 사용하지 않는가...?!

예~전에 이유를 알았는데 까먹어서 이유없이 사용하지 않고 있었다.
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 (){}

2. Recursion

간단한 recursion 몇 문제를 풀면서 감을 익히자...👀

1. Factorial : !5 = 5 4 3 2 1

"0! = 1", "1! = 1"인것만 알면 쉽다.

// factorial
const fact = n => n < 2 ? n : n * fact(n - 1)
log(fact(5)) // 24

2. Fibonacci : 0 1 1 2 3 5 8 13 21 34 ...

"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

3. repeatString

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

4. range

piazza에서 누가 질문하길래 나도 심심해서 만들어보았다! 🤟🏻
기본값으로 0 을 주어서 에러를 막았고,
endstart보다 클때는 값을 교환한다.
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]
profile
ggit

2개의 댓글

comment-user-thumbnail
2019년 6월 18일

모르고 있었는데 감사해요 완전 생소한 개념이라 찾아보니까 추가적인 참고할만한 것들이 있었어요. 공유합니다
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이 가지는 건지 아닌지 판단해주고 사용해야할 것 같군요

1개의 답글