let hyesoonScore = {
'데이터 모델링의 이해': 10,
'데이터 모델과 성능': 8,
'SQL 기본': 22,
'SQL 활용': 18,
'SQL 최적화 기본 원리': 20,
};
let minsoonScore = {
'데이터 모델링의 이해': 14,
'데이터 모델과 성능': 8,
'SQL 기본': 12,
'SQL 활용': 4,
'SQL 최적화 기본 원리': 16,
};
function passChecker(scoreObject) {
let score = 0;
for (let k in scoreObject) {
score += scoreObject[k];
}
score >= 60 ? console.log('축하합니다! 합격입니다!') : console.log('아쉽지만 불합격입니다..');
}
passChecker(hyesoonScore);
passChecker(minsoonScore);
이 코드를 작성하면서 두 가지 의문점이 생겼다.
1. 'score' 변수의 선언 위치
2. score 변수에 0을 할당하지 않고, 그냥 let score;로 선언했을 때 score의 누적값이 NaN이 되는 이유
먼저 1번을 분석해보면
score 변수를 passChecker 함수 바깥에 전역 변수로 선언해도 되는지 궁금했다.
안된다.
왜냐면 첫번째 함수 호출로 전달된 hyesoonScore의 for문을 돌고난 후 score에 누적된 값이,
두번째 함수 호출로 전달된 minsoonScore의 누적값을 구할 때 반영되기 때문이다.
전역 변수로 선언했기 때문에 그렇게 된 것이다.
만약 첫번째 함수 호출로 인해 전역 변수 score가 78이 됐다면,
두번째로 똑같은 함수를 호출해서 for문을 돌렸을 때 score의 값이 '78'인 상태에서 추가 누적이 되기 때문에
올바른 minsoonScore의 누적값을 구할 수 없다.
그다음, 2번을 분석해보면
그냥 let score;로 선언할 시 score 변수의 값은 'undefined'가 된다.
그래서 for문을 돌고 나면 undefined에 각 프로퍼티의 숫자값들을 더하게 되기 때문에 NaN(Not a Number)이 되는 것이다.
따라서 let score = 0; 으로 반드시 score의 초기값을 0, 즉 숫자로 초기화해줘야 올바르게 값을 누적한다.
'JS' 카테고리의 다른 글
| const 변수 vs const 상수 (0) | 2025.03.04 |
|---|---|
| 0.1 + 0.2 !== 0.3 (+해결방법) (0) | 2025.03.04 |
| 옵셔널 파라미터? (0) | 2025.03.02 |
| 콘솔 로그 안에서 콘솔 로그를 호출하면? (0) | 2025.03.02 |
| 형 변환 (문자, 숫자 -> 불리언 & 산수연산, 관계연산) (0) | 2025.03.01 |