开发者

Why does the radix for JavaScript's parseInt default to 8?

开发者 https://www.devze.com 2023-02-23 07:16 出处:网络
Defaulting the radix to 8 (if the string starts with a 0) in JavaScr开发者_StackOverflow社区ipt\'s parseInt function annoys me, only because I continue to forgot to pass the optional second argument a

Defaulting the radix to 8 (if the string starts with a 0) in JavaScr开发者_StackOverflow社区ipt's parseInt function annoys me, only because I continue to forgot to pass the optional second argument as 10. I'm looking for an answer telling me why it makes sense to have it default to 8.


It only "defaults" to 8 if the input string starts with 0. This is an unfortunate carryover from C and C++.

You can use Number('0123') instead, or, as you said in the question, parseInt('0123', 10).

How do I work around JavaScript's parseInt octal behavior?


Can you tell me more about this carryover?

  • Javascript eval function returning Octal value
  • Octal number literals: When? Why? Ever?

Note: ECMAScript strict mode removes octal syntax.


If a number starts with 0 and contains digits between (and inclusive) 0 to 7, it is interpreted as an octal number (with base 8 instead of 10).

In parseInt however, if a string starts with a 0 it's always interpeted as an octal, and stops searching when it encounters an invalid character (e.g. the digits 8 or 9 or a character like z).

parseInt("070");     //56
parseInt("70");      //70
parseInt("070", 10); //70
parseInt("78");      //78
parseInt("078");     //7, because it stops before 8

If you need to convert a string into a number, and you're sure that it contains no invalid characters or fractional parts, you can multiply it with 1 to make a number of it:

1 * "070";           //70

I personally prefer this approach, and believe it's faster than calling functions.


Now, a couple of years later, parseInt() seems to work fine with numbers starting with 0. Current browsers:

parseInt("019"); // 19 on Firefox 67
parseInt("019"); // 19 on Chrome 75
parseInt("019"); // 19 on Safari 12
parseInt("019"); // 19 on IE 11
parseInt("019"); // 19 on Edge 42

But still, this "fix" must break older scripts that rely on parseInt("019") returning 1 or 0 instead of 19...

0

精彩评论

暂无评论...
验证码 换一张
取 消