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

Jam*_*Lee 8 javascript

在查看parseInt(string, radix)中:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt

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

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

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

那么为什么不17(相15对于Mozilla文档和我在jsfiddle中的测试)呢?

任何见识将不胜感激。

Kai*_*ido 18

这是因为,0n就是八进制在JavaScript中,就像Oxn16进制

console.log(021 === 0x11 && 021 === 17);
Run Code Online (Sandbox Code Playgroud)

所以你写的东西被评估为 parseInt(17, 8);

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

console.log(parseInt(17, 8))
Run Code Online (Sandbox Code Playgroud)

请注意,0n在不赞成使用符号的严格模式下,所有这些事情都不会发生:

(function(){
  "use strict";
  // Syntax Error
  console.log(parseInt(015, 8))
})();
Run Code Online (Sandbox Code Playgroud)

  • 您为什么会说“ 015”八进制无效? (4认同)
  • 是的,你们是对的,我不介意... (2认同)

Ger*_*ado 12

的第一个参数parseInt应为字符串。相同的MDN链接显示

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

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

console.log(parseInt("021", 8))
Run Code Online (Sandbox Code Playgroud)

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

console.log(021.toString())
Run Code Online (Sandbox Code Playgroud)

这样您就可以看到结果:

console.log(parseInt("17", 8))
Run Code Online (Sandbox Code Playgroud)