SEB_FE_44/반딧불 ✨

JavaScript Koans

언젠간코딩잘함 2023. 3. 6. 16:09
Koans는 불교에서 유래된 단어로, 결론을 내리기 전에 이게 왜 맞는지 깊게 고민한다는 의미를 가지고 있다고 합니다. 답이 미리 제시되어 있기 때문에 고민 없이 풀면, 큰 어려움 없이 전부 다 풀 수 있습니다. 하지만 그게 왜 정답인지 깊게 고민해 보는 시간을 갖지 않는다면 충분히 성장하기 어려울 것입니다. Koans 문제 중에는 학습하지 않은 개념도 의도적으로 포함되어 있습니다. 페어와 함께 깊게 고민하고, 정답을 설명할 수 있도록 연습해 보세요.

헷갈렸던 부분

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();

      expect(age).to.equal(26);
      expect(name).to.equal("jimin");

      return innerFn;
    }

    const innerFn = outerFn();

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

 

Closure의 코드 부분이다. 여기서 선언 후 할당된 let과, 할당만 한 부분을 살짝 혼동했다.

그렇게 공부해 놓고선 맨날 헷갈린다. 바보 멍청이다.

 

 


몰랐던 부분

spread & rest

  • 함수 매개변수에 점(...)을 사용하는 경우 rest 매개변수이다.
  • rest 매개변수 나머지 모든 요소들을 배열로 수집한다.
  • 함수 호출에 점(...)을 사용하는 경우 Spread 연산자이다.
  • Spread 연산자는 배열과 같이 반복 가능한 객체를 단일 요소로 압축 해제한다.

객체에서의 rest

 

const blackCat = {
  name: '고양이',
  attribute: 'cute',
  color: 'black'
};

const { color, ...rest } = blackCat;
console.log(color); // black
console.log(rest); // Object {name: '고양이', attribute: 'cute'}

 

rest 안에 name 값을 제외한 값이 들어있다.

 

rest는 객체와 배열에서 사용할 때는 이렇게 비구조화 할당 문법과 함께 사용된다.

추출한 값의 이름이 꼭 rest 일 필요는 없다.

 


배열에서의 rest

 

const numbers = [0, 1, 2, 3, 4,];
const [first, ...rest] = numbers;

console.log(one); // 0
console.log(rest); // [1, 2, 3, 4]

 

배열 비구조화 할당을 통하여 원하는 값을 밖으로 꺼내고, 나머지 값을 rest 안에 넣었다.

 

 

const numbers = [0, 1, 2, 3, 4];
const [..rest, last] = numbers;

 

 이렇게 할 수는 없다. // SyntaxError

 


함수 파라미터에서의 rest

 

function sum(...rest) {
  return rest.reduce((acc, current) => acc + current, 0);
}

const result = sum(1, 2, 3, 4, 5, 6);
console.log(result); // 21

 

함수의 파라미터가 몇개가 될지 모르는 상황에서 rest 파라미터를 사용하면 매우 유용하다.

result 가 가르키고 있는 것은 함수에서 받아온 파라미터들로 이루어진 배열이다.

위에서는 reduce 함수를 사용했는데.. reduce는 앞으로 따로 공부할 예정!

 

 


단축 표기법 Shorthand notation

 

 it("객체의 단축(shorthand) 문법을 익힙니다", () => {
    const name = "김코딩";
    const age = 28;

    const person = {
      name,
      age,
      level: "Junior",
    };
    expect(person).to.eql({ name, age, level: "Junior" });
  });

  it("객체를 분해합니다", () => {
    const student = { name: "박해커", major: "물리학과" };

    const { name } = student;
    expect(name).to.eql(student.name);
  });

 

단축 표기법은 처음 들어봐서 검색을 좀 해보고 풀었다.

 

 

예)

var a = 1;
var b = 'two';
var obj = {a, b};

obj; // Object { a: 1, b: "two" }
obj.a === {a}.a; // true

// 이코드는

{ prop }
// 아래가 생략된 것
{ prop: prop }

 

 

이미 정의된 변수가 있을 때, 객체 리터럴에서 그 변수의 이름 그대로 하면서 값의 할당을 생략한다.

이러면 변수에 담긴 값이 그대로 할당된다.

 


 

단축 표기에 사용할 변수의 값이 객체타입일 경우

 

var a = {b: 1};
var obj = {a};
obj.a; // Object { b: 1 }

a.b = 2;
obj.a; // Object { b: 2 }

이렇게 되므로 주의

 

선언에서 활용

 

const {log} = console;

 

log 상수가 생성되면서 console.log가 할당됨.

 

 


단축 표기법은 더 써봐야지 잘 사용할 것 같다. 솔직히 아직 더 찾아보지 않아서 확실히 모르겠다..

구글링을 열심히 해봐야지......

 

페어님과 같이하는 문제였지만 페어님께서 코로나에 걸리셨다고 한다. 몸조리 잘하시길..ㅠㅠ