CodeStates

[블로깅]JaveScript Koans

숨냥 2023. 3. 6. 16:31

이틀에 걸쳐 코드스테이츠에서 페어와 함께 Koans 문제를 풀었다.

배웠던 내용들이고 쉽게 풀 수 있는 문제들이었지만 생각이 정리되지 않은 상태에서 풀기엔 쉽지 않은 문제들이 중간중간 나왔다.

생각을 정리하는데 페어분의 도움이 컸다. 생각할 시간을 주시고 잘못 생각한 부분을 함께 고민해가면서 알려주셨다,,🙏

문제를 풀면서 다시 한 번 배웠던 내용을 정리하고, 내가 잘 알고있는 내용과 모르는 부분을 구분해 확실하게 알 수 있게 된 시간이었다.

 

풀면서 어려웠던 문제들을 블로그를 쓰면서 다시 한번 복습해보는 시간을 가지려한다.

 


 

✓    Types_part1   표현식의 평가(evaluation) 결과를 예측. 

  it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
    expect(1 + '1').to.equal('11');
  }); 
  //숫자와 문자를 더하면 숫자를 문자 취급하다.

  it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
    expect(123 - '1').to.equal(122);
  }); 
  //숫자와 문자을 빼는 경우 문자를 숫자 취급한다.

  it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
    expect(1 + true).to.equal(2);
  }); 
  //숫자와 불린타입을 더했을 경우엔 true를 1로 취급한다.

  it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
    expect('1' + true).to.equal('1true');
  }); 
  // 문자와 불린타입을 더했을 경우는 '문자+불린타입'으로 내보낸다.

 

  • 숫자와 문자를 더했을 때, 숫자를 문자 취급하는건 알았지만 '2'로 입력했을 때 오류가 났었다.
    숫자가 문자로 변했기 때문에 계산식으로 더하면 안되고 옆에 붙이는 방식으로 더해줬어야 했다.
  • 불린 타입을 숫자와 더했을 때, true는 1로 취급하고 false는 0으로 취급한다. 

 

 

✓    Types_part4    lexical scope와 closure에 대해 다시 확인합니다. 

it('lexical scope와 closure에 대해 다시 확인합니다.', function () {
    let age = 27;
    let name = 'jin';
    let height = 179;

    function outerFn() {
      let age = 24;
      name = 'jimin';
      let height = 178;

      function innerFn() {
        age = 26;
        let name = 'suga';
        return height;
      }

      innerFn();  //innerFn() 실행 -> innerFn()외부(=outerFn()) 실행

      🔸 expect(age).to.equal(26); 
      🔸 expect(name).to.equal('jimin');
      return innerFn;
    }

    const innerFn = outerFn(); //변수 innerFn은 outerFn()내부에 있는 innerFn()과 동일하게 동작
    

    🔸expect(age).to.equal(27); 
    🔸expect(name).to.equal('jimin'); 
    🔸expect(innerFn()).to.equal(178); 
  });

 

스코프와 클로저에 관한 문제였다.

전역변수와 지역변수를 완벽히 이해를 해야 풀 수 있었던 문제였다. 변수의 선언이 되어있는지 알아채는게 중요하다.

🔸 expect(age).to.equal(26);  
// outerFn() 함수 안에서 age를 물었다.
let age = 24이지만 innerFn()함수에서 age = 26이라고 재할당을 해줬기 때문에 age는 26이 된다.

🔸 expect(name).to.equal('jimin');  
// innerFn()에서 name은 선언이 된 변수 이기 때문에 outerFn()의 name = 'jimin'과 같은 변수가 아니다.
따라서 'jimin' 그대로 출력 된다.

🔸expect(age).to.equal(27);   
// let age = 27과 let age = 24는 다른 변수이다.
innerFn()의 age = 26은 outerFn()의 age를 재할당 하기 때문에 전역스코프의 변수에는 영향을 주지 않는다.

🔸 expect(name).to.equal('jimin');   
//outerFn()에서 name을 재할달 해주었다. 따라서 let name = 'jin'은 let name = 'jimin'으로 바뀌게 된다.

🔸 expect(innerFn()).to.equal(178);   
//innerFn()은 heigth를 리턴하기때문에 선언된 heigth변수 중에서 가까운 변수 outerFn()의 heigth 값을 리턴하게 된다.