Number()와 parseInt()는 무엇이 같고 다를까?
自初至終(자초지정)
숫자형으로의 형변환이 필요한 경우 나는 무의식적으로 줄 곧 Number() 메서드만 사용해 왔다. 공부를 하면서 parseInt()라는 메서드로도 숫자형으로 형변환할 수 있다는 걸 알게 되었고, "아니 같은 기능을 하는거면 뭐하러 두개씩이나 있는거지?" 라는 의구심으로 좀 더 자세히 알아보았다.
parseInt(String, [radix])
radix 파라미터는 사용하려는 숫자 시스템을 지정하는데 쓰이는데, 예를 들어 radix 파라미터 값이 16이면, 16진수로 String 파라미터의 구문을 분석한다.
두번째 radix 파라미터에는 2부터 36까지 입력할 수 있으며, 입력하지 않으면 일반적으로 10(10진수)으로 구문 분석을 하지만, Javascript는 다음과 같은 작업을 한다.
- String 파라미터의 문자열이 "0x"로 시작하는 경우 radix 파라미터는 16(16진수)이 된다.
- String 파라미터의 문자열이 "0"으로 시작하는 경우 radix 파라미터는 8(8진수)이 된다.
- String 파라미터의 문자열이 다른 값으로 시작되는 경우 radix 파라미터는 10(10진수)이 된다.
Number(object)
Number() 함수는 객체 인자 값을 숫자형으로 변환을 한다.
- 전달받은 객체 인자 값이 숫자형으로 변환할 수 없는 경우엔 NaN을 반환한다.
아래 예시를 통해 대략적으로 Number()와 parseInt()의 특징을 살펴 보자.
parseInt("나는 100원이나 있다!") // NaN
parseInt("100원이나 있다고!") // 100
parseInt("100", 2) // 4
parseInt("100e1") // 100
parseInt(true) // NaN
parseInt("") // NaN
parseInt("123.45") // 123
Number("나는 100원이나 있다!") // NaN
Number("100원이나 있다고!") // NaN
Number("100e1") // 1000
Number(true) // 1
Number("") // 0
Number("123.45") // 123.45
위 예시 중에 아래의 내용을 좀 더 살펴보면,
parseInt("123.45") // 123
Number("123.45") // 123.45
위 내용을 보고 parseInt()는 소수부분은 버리고 정수부분만 반환해주는 특징이 있구나라고 생각했지만, 이건 parseInt()의 작동 방식을 모르고 말한 애먼 소리였다.
parseInt()는 변환할 수 있는 숫자형이 확인 되는 순간부터 숫자형으로 변환할 수 없는 값(Non-digit)이 나오기 전까지만 구문 분석하고 해당 값을 반환하기 때문에 숫자형 가운데 떡하니 있는 소숫점(.)이 확인되면 변환할 수 없는 값이라 판단하고 그 앞에 값까지만 반환하는 것 뿐이었다.
소수부분도 필요할 경우에는 parseFloat(string)를 사용하자.
parseFloat(String)
파라미터로 입력받은 문자열을 실수로 변환 한 값을 리턴한다.
parseInt()처럼 숫자형으로 변환할 수 없는 경우와 첫 글자가 숫자로 변환할 수 있는 값인 0 부터 9, 부호(+,-), 소수점(.), 지수가 아닌 경우에는 NaN을 리턴한다.
parseInt()와는 다르게 소수점(.)은 인정한다.
추가적으로 선행 0으로 시작되는 경우에는 8진수로 강제 변환이 되기 때문에 사용 시 조심해야 한다는 답변을 보았고 좀 더 확인해 보았다.
확인 결과, ECMAScript3 이전에 8진수로 강제적으로 실행되었던 것이 ECMAScipt5 이후부터 선행된 0이 무시되어 10진수로 파싱된다.(strict모드에서도 동일)
#ES3이하 버전 parseInt("080") // 120 (8진수로 변환) #ES5이상 버전 parseInt("080") // 80 (10진수로 변환)
정리
1. 숫자형으로 변환하려고 할때는 Number()를 통해서만 하자.
2. parseInt()를 사용할 경우, 반드시 radix 파라미터를 통해 진수를 명시적으로 지정하자.
참고
Number - JavaScript | MDN
Number 객체는 숫자 값으로 작업할 수 있게 해주는 래퍼(wrapper) 객체입니다. Number 객체는 Number() 생성자를 사용하여 만듭니다. 원시 숫자 자료형은 Number() 함수를 사용해 생성합니다.
developer.mozilla.org
parseInt() - JavaScript | MDN
parseInt() 함수는 문자열 인자를 구문분석하여 특정 진수(수의 진법 체계에 기준이 되는 값)의 정수를 반환합니다.
developer.mozilla.org