for-in 루프에서 프로퍼티의 값이 숫자인지 판단하는 방법

조회수 403회

현재 인터넷으로 코딩 독학 중인 사람입니다. 제가 지금 배우고 있는 사이트의 한 예시를 가져온 것입니다.

var obj = {
    name: "object",
    age: 10,
    weight: 5
}
var sum = 0;
for ( var i in obj ){
    if( typeof( Object.keys(i) ) == "number" ){
        sum = sum + i ;
    }
}
console.log("sum :", sum);

Object.keys(i) 를 통해서 객체 obj 의 value 값들 중 typeof 가 number 인 것들을 (value 값이 숫자인 것들) 모두 합한 값은 sum 에 넣어 출력 하라는 예시 인데 실제로 실행을 해보니 0 이 나오고 숫자를 value 값으로 가지고 있는 key 들의 type 은 number 가 아닌 object 로 나옵니다.

어떻게 코드를 변경해야 원하는 대로 작동이 될지 모르겠습니다...
도와주세요!

1 답변

  • 결론

    이렇게 고치세요.

    for (var i in obj) {
        if (typeof obj[i] == 'number') {
            sum += obj[i];
        }
    }
    

    문제점

    원래의 코드에서:

    for (var i in obj) {
        if (typeof( Object.keys(i) ) == "number") {
            sum = sum + i ;
        }
    }
    

    이 부분만 살펴보죠.

    iobj의 프로퍼티 중 어느 하나의 이름입니다. 질문 내용대로면 'name', 'age', 'weight'에 해당합니다. 이 중 'age'가 i에 할당되었다 칩시다. 그러면 코드가 아래와 같겠죠?

    typeof Object.keys('age');
    

    Object.keys() 메서드에 문자열을 할당하면 문자열 길이만큼의 요소가 있는 배열을 반환합니다. 요소는 0부터 1씩 증가하지만 타입은 string인 숫자입니다. (이 숫자들이 무슨 의미인지는 저도 모릅니다. 0부터 시작하니 아마도 인덱스겠죠) 아래와 같습니다:

    typeof [ "0", "1", "2" ]
    

    자바스크립트에서 배열은 객체이기 때문에 typeof 연산자는 'object'를 반환합니다.

    그래서 if문 안으로 진입할 수 없고 sum의 초기화값인 0을 그대로 출력하게 됩니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)