질문:
JavaScript에서 40이 32로 표현되는 이유는 무엇입니까?
var num = 040; console.log(num); // 32
정답:
JavaScript에서 숫자는 앞에 0x가 있는 것처럼 앞에 0이 있기 때문에 8진수(기본 8)로 처리됩니다. it 16진수(기본 16)과 동일합니다. 이 동작은 오랜 역사를 가지고 있지만 최신 JavaScript에서는 8진수가 더 이상 이 형식으로 작성되지 않습니다. 엄격 모드를 사용하는 최신 JavaScript에서 "전통적인" 8진수 형식은 0o 접두사를 사용하여 작성해야 하는 구문 오류입니다.
역사:
초기에는(원래 Netscape 언어와 첫 번째 및 두 번째 ECMAScript 사양에서) 숫자 리터럴의 앞에 오는 0이 형식적으로 8진수(기본 8)를 나타냈습니다. ), 앞에 오는 0x가 16진수(기본)을 나타내는 것과 마찬가지로 16):
OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit
예를 들어 10, 012, 0xA는 모두 십진수 10을 나타내는 방식입니다. 이는 구문이 JavaScript와 유사하지만 매우 혼란스러운 일부 다른 언어(예: C, C++ 및 Java)와 일치합니다.
ECMAScript 3부터 이 형식의 8진수 리터럴은 선택적 확장으로 강등되었으며 10진수 정수 리터럴은 선행 0을 가질 수 없도록 변경되었습니다(구현에 확장명이 포함되지 않는 한).
DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits(opt)
그러나 엄격 모드에서 ECMAScript 5는 다음을 금지합니다.
엄격 모드 코드를 다룰 때(참조 10.1.1), 적합한 구현은 B.1.1에 설명된 대로 OctalIntegerLiteral을 포함하도록 NumericLiteral의 구문을 확장해서는 안 됩니다.
ECMAScript 6(ECMAScript 2015)에는 BinaryIntegerLiteral과 OctalIntegerLiteral이 도입되었으므로 이제 더 일관된 리터럴이 있습니다.
이전 OctalIntegerLiteral 확장의 이름이 LegacyOctalIntegerLiteral로 변경되었으며 이는 여전히 비엄격 모드에서 허용됩니다.
결론:
따라서 8진수를 구문 분석하려면 0o 또는 0O 접두사(이전 브라우저에서는 지원되지 않음)를 사용하거나,parseInt를 사용할 수 있습니다.
숫자가 10진수로 구문 분석되도록 하려면 선행 0을 제거하거나 parseInt를 사용하세요.
예: 엄격 모드의
010
0o10, 0O10
parseInt('010', 8)
parseInt('010', 10)
관심이 있으시면 여기에서 현재 최신 사양과 여기에서 이전 버전을 찾아보실 수 있습니다.
위 내용은 JavaScript에서 `040`이 `32`와 같은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!