为什么parseInt(021,8)=== 15?

时间:2019-05-01 04:31:33

标签: javascript

在以下方面查看parseInt(string, radix)https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt

除此示例外,所有13示例都非常合理。

根据一个示例,parseInt(015, 10)将返回13。假定以0开头的数字被视为八进制是有意义的,而与10出现在基数位置无关。

因此,如果在问题标题中指定了八进制: parseInt(021, 8)

然后为什么不按照Mozilla文档以及我在jsfiddle中的测试将其设为17(与15相比)?

任何见识都会受到赞赏。

3 个答案:

答案 0 :(得分:18)

这是因为JavaScript中0noctal notation,就像Oxnhex notation

console.log(021 === 0x11 && 021 === 17);

所以您写的内容被评估为parseInt(17, 8);

然后将这17个数字强制转换为字符串"17",结果为15。

console.log(parseInt(17, 8))

请注意,在0n符号已被弃用的严格模式下,所有这些操作都不会发生:

(function(){
  "use strict";
  // Syntax Error
  console.log(parseInt(015, 8))
})();

答案 1 :(得分:12)

parseInt的第一个参数应为字符串。相同的MDN link说:

  

要解析的值。如果string参数不是字符串,则将其转换为字符串(使用ToString抽象操作)。

您可以看到它按预期工作:

console.log(parseInt("021", 8))

测试中的问题是您使用的是数字,而不是字符串。如您所知,当您将021用作数字时(当您说“以0开头的数字被视为八进制” )时,它将转换为"17"

console.log(021.toString())

这为您提供了所看到的结果:

console.log(parseInt("17", 8))

答案 2 :(得分:4)

当您键入group by时,这是有效的八进制数字,并且由于前缀declare @temptbl table ( CustomerId int, TotalPrice int, Name varchar(50), [Rank] int); insert into @temptbl select 1,100,'TV' ,1 union all select 2,50 ,'Coffee' ,1 union all select 1,70 ,'PC' ,2 union all select 3,30 ,'Clothes' ,1 union all select 1,60 ,'Games' ,3 union all select 1,50 ,'Drinks' ,4 select CustomerId, top1 = MAX(CASE WHEN [Rank] = 1 THEN (Name) ELSE NULL END), top1_price = SUM(CASE WHEN [Rank] = 1 THEN TotalPrice ELSE NULL END), top2 = MAX(CASE WHEN [Rank] = 2 THEN (Name) ELSE NULL END), top2_price = SUM(CASE WHEN [Rank] = 2 THEN TotalPrice ELSE NULL END), top3 = MAX(CASE WHEN [Rank] = 3 THEN (Name) ELSE NULL END), top3_price = SUM(CASE WHEN [Rank] = 3 THEN TotalPrice ELSE NULL END) from @temptbl group by CustomerId JS将其转换为十进制021。但是如果您输入的无效八进制数字例如019,那么JS不会将其转换,而是视为十进制

0