var x = 010;
console.log(x); //8
JS引擎将数字转换x
为八进制数字。为什么会这样呢?我该如何预防?
历史
问题在于十进制整数文字不能包含前导零:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
但是,ECMAScript 3允许(作为可选扩展)解析以8为底的前导零的文字:
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
但是ECMAScript 5禁止以严格模式执行此操作:
一致性实现,在处理时严格模式代码(见10.1.1) ,必须不延伸的语法 NumericLiteral 包括_OctalIntegerLiteral_ 如描述B.1.1。
ECMAScript 6引入了 BinaryIntegerLiteral 和 OctalIntegerLiteral,所以现在我们有了更多连贯的文字:
0b
或 开头0B
。0o
或 开头0O
。0x
或 开头0X
。旧的 OctalIntegerLiteral 扩展名已重命名为 LegacyOctalIntegerLiteral ,但仍可以在非严格模式下使用。
结论
因此,如果要解析以8为底的数字,请使用0o
或0O
前缀(旧浏览器不支持)或使用parseInt
。
而且,如果您想确保自己的数字将以10为底进行解析,请删除前导零或使用parseInt
。
例子
010
8
(取决于实现)。0o10
, 0O10
8
。parseInt('010', 8)
8
。parseInt('010', 10)
10
。问题内容: 我正在将一些JSON文件导入到我的Parse.com项目中,并且不断收到错误“无效的键:值对”。 它指出有一个意外的“ 8”。 这是我的JSON的示例: 如果我通过从中删除JSON 或将其转换为JSON来更新JSON,则它变为有效。 JSON是否真的可以接受以开头的整数,或者是否可以解决问题? 问题答案: 前导0表示JavaScript中的八进制数。八进制数字不能包含8;因此,该数字无
问题内容: 我正在生成一个json对象, 当使用Newtonsoft.Json在C#中反序列化此对象时,由于前导零,因此将 0100 视为八进制数。有没有一种方法可以覆盖此功能,并将其视为十进制整数? 问题答案: 我已经看过了(读数字的“魔术”发生的方法)。我会说这是行不通的。八进制情况特别处理 然后 我没有找到任何方法来覆盖此方法(除了重写 所有 在Json解析中执行所有操作的方法) __
问题内容: 为什么在Java中(我不知道任何其他编程语言)标识符不能以数字开头,为什么也不允许以下声明? 问题答案: 通常,您将这种限制放入其中有两个原因: 用电子方式解析很痛苦。 对人类来说这是一个痛苦的解析。 考虑以下代码片段: 如果是合法标识符,那么末尾有哪个值?-3还是2?这是模棱两可的。 同时考虑: 最后有什么价值?这也是模棱两可的。 另外,以任何一种方式阅读都是很痛苦的。如果有人声明,
问题内容: 为什么下面的Java代码 打印’Infinity’且未定义。这在数学上不是错吗? 问题答案: 在数学中,有许多支持算术的不同结构。最突出的数字(例如自然数,整数和实数)不包括无穷大。在那些系统中,不支持除以零。 其他系统的确包含至少一个无穷大。参见,例如,真实的投影线。它确实允许被零除。 只有一种方法可以知道在特定系统中数学定义或未定义的内容-研究该系统。 类似地,操作是可交换的(a
编者按:此代码示例来自Rust 1.0之前的版本,并且在语法上是无效的Rust 1.0代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。 肯定有更好的方法将二进制字符串转换为十六进制字符串比这? 这样做的结果是 我用的是Rustc0.12。夜间
问题内容: 尝试这个: 因为什么时候40 = 32? 问题答案: 带有前导零的数字将解释为八进制和。