얼마전에 코딩테스트를 풀다가 문자를 숫자로 변환해야 하는 과정이 필요했는데
대수롭지 않게 parseInt로 변환했다가 왜 틀리는지를 못 찾아서 고생했던 경험이 있는데
알고보니 그냥 순수 숫자로만 되어있는 문자열이 아니라 숫자+문자의 조합이었는데, 만약에 이 값이 NaN을 반환했다면 오류를 쉽게 발견할 수 있었지만
무슨 일에서인지 숫자가 반환되어서 다른 과정에 오류가 있다고 생각했던것...
parseInt 작동 과정
- parseInt() 함수는 문자열 인자를 파싱하여 특정 진수(수의 진법 체계에서 기준이 되는 값)의 정수를 반환합니다.
parseInt(string);
parseInt(string, radix);
첫 번째 인자를 문자열로 변환함 (문자열의 선행 공백은 무시한다고 함)
변환된 값을 radix의 값에 따라 변환함
radix에는 string을 몇 진수로 변환할 것인지를 넣어주면 되는데 사용할 때 아무 값도 안 넣는 경우가 많아서 default 값이 10인건가? 할 수 있지만
입력 값이 "0x" 또는 "0X"(0과 대/소문자 X)로 시작하는 경우 radix를 16으로 간주하여 나머지 문자열을 16진수로 파싱합니다.
입력 값이 그 외의 다른 값으로 시작하면 radix는 10(10진수)입니다.
보통 0x로 시작하는 일이 거의 없기 때문에 10진수로 변환해주었던 것만약 parseInt 함수가 지정한 radix에서의 숫자가 아닌 문자를 마주치는 경우 해당 문자 이전까지의 문자만 사용해 파싱하며 문제의 문자와 그 이후는 모두 무시합니다. parseInt는 정수 값을 반환하기 위해 소수점 이하 값을 잘라냅니다. 선행 및 후행 공백은 허용됩니다.
여기서 중요한 점은 '해당 문자 이전까지의 문자만 사용해 파싱'해준다는 것인데,
예를 들어 ' 11aa' 라는 문자열을 10진수로 변환할 때, 10진수의 값이 아닌 a를 만나게 되면 그 이전의 값인 '11'까지는 파싱해서 11이라는 값을 반환하게 됨(선행 공백은 알아서 무시함)
=> 요약하자면 radix로 표현할 수 없는 값을 만나게 되면 NaN을 리턴하는 게 아니라, 그 이전 값까지는 모두 파싱해서 그 값을 리턴함
- Number()의 경우에는 저런 숫자+문자 조합에서는 NaN을 리턴함
'JS' 카테고리의 다른 글
프로그래머스 - 괄호 변환 JS (0) | 2023.08.01 |
---|---|
import한 함수 에러 처리법 (0) | 2023.07.22 |
프로그래머스 - 보석 쇼핑 JS (0) | 2023.07.17 |
프로그래머스 - 인사고과 JS (0) | 2023.07.13 |
프로그래머스 - 큰 수 만들기 JS (0) | 2023.07.12 |