티스토리 뷰

발생일: 2011.03.24

문제:
작성한 코드를 JSLint 에서 돌렸더니, 아래와 같은 워닝 문구가 발생했다.

    Do not use Number as a constructor.

대상이 된 코드는 아래와 같은 함수이다.
전달된 문자를 숫자로 변환하고, NaN이거나 0일 경우 기본값을 1로 설정하는 구문이다.

    var n = new Number(s).valueOf() || 1;

문제가 될 것 같지 않은데... 왜 그런 걸까.


해결책:
위에서 작성한 구문에서는 문제될 것이 없지만,
Number를 원시 타입이 아닌 객체로 생성하고 비교할 경우
값이 아닌 참조에 대한 비교가 되어 원하는 결과를 얻지 못할 수 있기 때문에 JSLint에서 잡아주는 것 같다.

    var n1 = new Number(1);
    var n2 = new Number(1);
    alert(typeof n1); // "object"가 리턴된다.
    alert(n1 == n2); //  false가 리턴된다. n1과 n2는 각각 Number 객체의 참조를 가지고 있기 때문.


하지만 비교가 아닌 연산의 경우엔 크게 문제가 없다.
연산 문맥에 따라 객체의 valueOf()나 toString()이 호출되기 때문이다.

    var a = n1 + n2; // a에는 2가 할당된다. 내부적으로 n1.valueOf() + n2.valueOf(); 로 계산된다.
    alert(typeof a); // "number"가 리턴된다.


기본적인 내용이지만, 요게 냄시나는 코드가 될 수 있을 것 같아 메모해둔다. ^^;
JSLint에서 에러를 뿜었던 위 코드는 아래와 같이 수정했다.

    var n = Number(s) || 1;



#.참고
반응형
댓글
공지사항