Home
All Posts
🎱

자바스크립트 옥탈 리터럴?

Created
2023/12/02
Tags
JavaScript
Category
Troubleshoot
2 more properties

오늘의 에러

0으로 시작하는 숫자가 포함되었을 때의 예외 처리를 해야하는데, 이를 테스트하는 코드를 작성하다 아래와 같은 에러를 만났다.
Octal literals로 인한 에러 화면
Octal literals..?
처음 보는 에러에 처음 들어보는 단어였다. 일단 사전을 찾아보니 octal은 8진법이라는 뜻이라고 하니, 자바스크립트에서는 8진법에 대한 어떠한 규칙이 있나보다 추측했다.
octal의 뜻 @naverdic
우선은 에러 메시지가 추천해 주는 방법처럼 숫자가 아닌 문자열로 만들었는데, 이 에러가 왜 발생하는지, 옥탈 리터럴은 무엇인지, 그리고 다른 해결 방법은 없는지 궁금해 찾아보았다.

처음 작성한 코드

describe('시도 횟수 유효성 검사', () => { const validTryCounts = [1, 5, 99]; const invalidTryCounts = [-1, 02, 'abc', '@']; // 02 로 작성 test('양의 정수가 아니면 실패', () => { invalidTryCounts.forEach((tryCount) => { expect(isValidTryCount(tryCount)).toBe(false); }); }); });
JavaScript
복사
위와 같이 02로 작성했다. 0이 맨 앞에 왔던 게 에러의 원인이었다.

원인과 해결 방법

에러에서 말하는 내용과 원인에 대해서는 아래와 같이 여러 자료들을 서칭해 보았다.
우선 첫 번째로 찾아본 블로그 글에서 0으로 시작하는 Octal literals은 JavaScript strict mode에서는 허용되지 않는다고 한다. ES6 모듈을 정의하는 경우, 스코프는 자동으로 strict mode가 되는데, 엄격 모드에서는 8진수 표기법을 애매한 표기법으로 규정했기 때문이다.
블로그 글 설명
두 번째로 찾아본 stackoverflow 글에서는 에러 메시지에서 주는 해결 방법처럼 문자열 처리를 해주었다고 한다. 물론 자바스크립트 내장 함수인 parseInt( )를 활용한 사람도 있었다.
stackoverflow 설명
마지막으로, 더 공식적인 MDN에서 알려주는 내용도 찾아보았다. 위 블로그 글에서 설명한 것처럼 엄격 모드에서 8진 리터럴은 에러를 던지기에 에러 메시지에서 알려준 해결 방법처럼 0을 맨 앞자리에 두고 대문자 O나 소문자 o를 작성0O20o2와 같은 형식으로 사용하라고 제안한다.
MDN 설명

수정한 코드

정리하자면, 자바스크립트에서 숫자 리터럴이 '0'으로 시작하는 경우, 이는 8진수(옥탈) 리터럴로 해석된다. 이는 현대의 자바스크립트 엔진에서는 사용되지 않는 구식 문법이다.
그렇기에 이를 사용하려고 할 때 "Octal literals are not allowed"라는 에러가 발생한다. 따라서 02와 같은 값을 테스트하고자 하는 경우, 02와 같은 숫자 대신 '02'와 같이 문자열로 표현해야 한다.
아래는 수정된 코드다.
describe('시도 횟수 유효성 검사', () => { const validTryCounts = [1, 5, 99]; const invalidTryCounts = [-1, '02', 'abc', '@'];// '02'와 같이 문자열로 변경 test('양의 정수가 아니면 실패', () => { invalidTryCounts.forEach((tryCount) => { expect(isValidTryCount(tryCount)).toBe(false); }); }); });
JavaScript
복사