[TIL]JS Koans

Yunu·2022년 7월 12일
0

Koans

  1. Introduction

테스트하는 값과 기대값을 비교하기 위해 expect 함수를 사용합니다.

expect(테스트하는값).기대하는조건
expect(isEven(3)).to.be.true => 'isEven(3)'의 결과값은 참(true)이어야 한다'

expect(1 + 2).to.equal(3) => 'sum(1, 2)의 결과값은 3과 같아야(equal) 한다'

(.equal은 두 값이 타입까지 엄격하게 같은지 검사(strict equality, ===)합니다.)

'기대하는조건'에 해당하는 함수를 matcher라고 합니다.
mocha, chai framework에는 다양한 matcher가 있지만, 이번 과제에서는 그 일부가 사용

단순히 테스트를 통과하는 것을 넘어, '왜 통과하는지'를 고민하는 시간이 되었으면 합니다.

  1. Types-part1

"비교연산자 '=='는 두 값의 일치 여부를 느슨하게 검사(loose equality)합니다."
느슨한 동치 연산(loose equality)는 프로그램의 작동을 예측하기 다소 어렵게 만듭니다.

지금부터는 엄격한 동치 연산(strict equality) '==='을 사용하시기 바랍니다.

// expect(0 == false).to.be.true;
// expect('' == false).to.be.true;
// expect([] == false).to.be.true;
// expect(![] == false).to.be.true;
// expect([] == ![]).to.be.true;
// expect([] == '').to.be.true;
// expect([] == 0).to.be.true;
// expect([''] == '').to.be.true;
// expect([''] == 0).to.be.true;
// expect([0] == 0).to.be.true;

지금까지 본 것처럼 자바스크립트에는 다소 이해하기 힘든 부분들이 존재합니다.
아래처럼 자바스크립트의 별난(quirky) 부분들을 따로 모아둔 저장소도 있을 정도입니다.
https://github.com/denysdovhan/wtfjs

  1. LetConst
    "'const'로 선언된 변수에는 재할당(reassignment)이 금지됩니다."

"'const'로 선언된 배열의 경우 새로운 요소를 추가하거나 삭제할 수 있습니다."

const arr = [];
const toBePushed = 42;
arr.push(toBePushed);
expect(arr[0]).to.equal(42);

"'const'로 선언된 객체의 경우, 속성을 추가하거나 삭제할 수 있습니다."

const obj = { x: 1 };
expect(obj.x).to.equal(1);

delete obj.x;
expect(obj.x).to.equal(undefined);

재할당도 안되는 'const' 키워드를 굳이 써야하는지 이해가 안 될수도 있습니다.
'let' 키워드는 재할당이 가능하기 때문에 여러모로 편하고, 큰 문제도 없어 보이기 때문입니다.
이에 대해서 잠시 고민하신 후, 'const'가 추천되는 이유에 대해 직접 찾아보시기 바랍니다.

*구글 자바스크립트 코딩 스타일 가이드
https://google.github.io/styleguide/jsguide.html#features-use-const-and-let

  1. Scope

scope는 변수의 값(변수에 담긴 값)을 찾을 때 확인하는 곳을 말합니다.

'함수 선언식(declaration)과 함수 표현식(expression)의 차이를 확인합니다.'

function funcDeclared() {
return 'this is a function declaration';
}

funcExpressed = function () {
  return 'this is a function expression';
};

*JS 함수 호이스팅(hoisting) 이란?

인자가 있으면 매개변수가 거기로 들어감

클로저

A closure is the combination of a function and the lexical environment within which that function was declared. This environment consists of any local variables that were in-scope at the time the closure was created.

  클로저는 함수와 함수가 선언된 어휘적 환경의 조합을 말한다.
  이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성된다.

여기서의 키워드는 "함수가 선언"된 "어휘적(lexical) 환경"입니다. 
특이하게도 자바스크립트는 함수가 호출되는 환경와 별개로, 기존에 선언되어 있던 환경 - 어휘적 환경 - 을 기준으로 변수를 조회하려고 합니다.
유어클레스 영상에서 언급되는 "외부함수의 변수에 접근할 수 있는 내부함수"를 클로져 함수로 부르는 이유도 그렇습니다.

클로저의 유즈 케이스를 검색해 보시기 바랍니다. 아래 검색 키워드를 활용합니다.
function factories
namespacing private variables/functions

0개의 댓글

관련 채용 정보