最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - parseInt("010", 10); vs. parseInt(010, 10); - Stack Overflow

programmeradmin3浏览0评论

I'm confused about a particular result of parseInt. I thought I understood most of its quirks, but this one is unclear.

parseInt("010", 10); // 10

parseInt(010, 10);   // 8, but expecting 10

In the second example I specified the correct radix. What's the reason for the unexpected result?

Solution

The problem is with octal literal. When a number is prepended with 0, it's seen an as octal literal.

If you execute

console(010); // 8

in non-script mode, you will get 8. The reason that parseInt is having what I thought was strange behavior was because I was essentially executing

parseInt(8, 10); // 8

and expecting 10.

ParseInt never saw 010, only 8. Thanks to everyone for helping out.

I'm confused about a particular result of parseInt. I thought I understood most of its quirks, but this one is unclear.

parseInt("010", 10); // 10

parseInt(010, 10);   // 8, but expecting 10

In the second example I specified the correct radix. What's the reason for the unexpected result?

Solution

The problem is with octal literal. When a number is prepended with 0, it's seen an as octal literal.

If you execute

console(010); // 8

in non-script mode, you will get 8. The reason that parseInt is having what I thought was strange behavior was because I was essentially executing

parseInt(8, 10); // 8

and expecting 10.

ParseInt never saw 010, only 8. Thanks to everyone for helping out.

Share Improve this question edited Nov 17, 2013 at 4:56 AndrewJM asked Nov 17, 2013 at 3:51 AndrewJMAndrewJM 1,3762 gold badges16 silver badges26 bronze badges 2
  • 4 Why would you want to use parseInt on a Number literal anyway? – bfavaretto Commented Nov 17, 2013 at 4:01
  • It't not a practical use, but I couldn't stop wondering. – AndrewJM Commented Nov 17, 2013 at 4:53
Add a ment  | 

2 Answers 2

Reset to default 10

Number literals beginning with zero are in octal, rather than decimal, so 010 is equal to 8, unless operating under strict mode.

It's important to note that the behavior of parseInt varies depending on what version of ECMAScript (JavaScript) your browser uses or if you're operating strict mode. See Octal Interpretations with No Radix for more detail.

The number is being parsed before being passed to parseInt.

For example, it's similar to how this works:

var x = 010;
console.log(x); // 8
parseInt(x, 10); 

Since you're passing 8 in, of course you're going to get 8 back. Prepending a number with 0 will make it an octal literal, which is using a base of 8. You can either remove the leading 0 (having the leading 0 there doesn't really make sense in the first place), or (as you did in your question) pass it as a string.

Note that not all browsers do this, it is simply ones that are patible with previous code that do this (it's not required), and implementations must not parse octal literals in ES5 strict mode. To see this in effect, pare the non-strict version:

(function ()
{   // not strict
    parseInt(010, 10);
})();

... which returns either 8 or 10 (depending on the implementation), with the strict version:

(function ()
{   "use strict";
    parseInt(010, 10);
})();

This will result in a SyntaxError: Octal literals are not allowed in strict mode..

发布评论

评论列表(0)

  1. 暂无评论