오늘은 이런 트러블슈팅을 했다.
퀴즈 프로그램을 만드는 중, 기존에 만들어둔 버튼을 재활용하기 위해 버튼에 부착된 이벤트리스너를 제거해야 했다(이벤트 위임을 하면 아예 발생하지 않았을 문제 같기도 하다).
따라서 문제의 정답과 보기가 이미 존재할 때, 그 문제의 보기(선택지)를 초기화해주는 작업을 위한 코드, 즉 조건문을 작성했다.
if (this.$validChoices && this.$correctAnswer) {
this.#detachEventListenerFromChoices();
}
그런데 코드를 테스트 하는 도중, 정답을 클릭하지 않았는데 다음 문제로 넘어가거나, 정답을 눌렀을 때, 오답 표시도 함께 생기는 버그가 생겼다.
원인을 찾다가 이윽고 문제를 발견했다.
$correctAnswer
는 0부터 3까지의 정수였는데, 이 변수가 0이 되면 저 조건문이 통과되지 않는 것이다. 즉, 의도하지 않은 동작을 했다.
그래서 이 문제를 해결하기 위해 어떻게 해야 할까, 고민했다.
결론은 간단했다. $correctAnswer
를 검사하지 않으면 된다. $validChoices
만 검사해도, 충분히 의도한 프로그램의 동작을 구현할 수 있었다.
조건문에 변수를 넣을 때 그 변수가 가지는 값이 의도치 않게 true나 false로 변환될 수 있는지 염두에 두자.
'프로그래밍-학습기록 > Javascript' 카테고리의 다른 글
클래스 리스트 순서에 따른 구현은 위험하다! (2) | 2021.04.01 |
---|---|
Javascript를 배우기에 알면 좋을 배경 지식들 1 (ECMAScript, 자바스크립트 엔진, 런타임) (0) | 2021.03.26 |
배열을 같은 값으로 초기화할 때 하드코딩보다 Array(number).fill(something)를 사용하자. (0) | 2021.03.12 |
Array 메소드(filter, find 등)의 반환 값을 잘 알아두자. (0) | 2021.03.11 |
자바스크립트 클래스 메소드에서 이벤트리스너 콜백 함수를 작성할 때 주의해야 할 this 바인딩 (0) | 2021.03.10 |