在以下方面查看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
相比)?
任何见识都会受到赞赏。
答案 0 :(得分:18)
这是因为JavaScript中0n
是octal notation,就像Oxn
是hex 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