如何解决JavaScript中parseInt的八进制行为问题?

10 浏览
0 Comments

如何解决JavaScript中parseInt的八进制行为问题?

尝试在JavaScript中执行以下代码:

parseInt('01'); //等于1
parseInt('02'); //等于2
parseInt('03'); //等于3
parseInt('04'); //等于4
parseInt('05'); //等于5
parseInt('06'); //等于6
parseInt('07'); //等于7
parseInt('08'); //等于0 !!
parseInt('09'); //等于0 !!

我刚刚以艰难的方式了解到,JavaScript认为前导零表示一个八进制整数,由于在八进制中没有"8"或"9",所以函数返回零。无论你喜不喜欢,这是一种设计。

如何解决这个问题?

注意:为了完整起见,我将要发布一个解决方案,但这是一个我讨厌的解决方案,请发布其他/更好的答案。


更新:

JavaScript标准的第5版(ECMA-262)引入了一个破坏性变化,消除了这种行为。Mozilla有一个很好的说明。

0
0 Comments

在JavaScript中,使用parseInt函数将字符串转换为整数时,存在一个问题,即对于以0开头的字符串,parseInt会将其解析为八进制数。例如,parseInt('08')的结果是0,而不是期望的8。

根据parseInt文档的说明,可以使用可选的radix参数来指定基数为十进制。

parseInt('08', 10); //结果为8
parseInt('09', 10); //结果为9

然而,对于很多人来说,在每次调用parseInt时都传递第二个参数来指定基数是一件繁琐且容易出错的事情。因此,有人提出了使用自定义函数来调用内置函数并填充常量参数的方法。

然而,这种自定义包装函数的方法并不被广泛接受,因为在实际使用中,很多人会批评你编写这样的函数。这样的自定义包装函数并不适用于这个问题。

某些情况下了另一种解决方案,即在函数式表达式中使用parseInt时,需要使用一个包装函数来确保正确的解析。例如,在使用map函数时,如果直接使用parseInt作为回调函数,会出现问题。因为map函数会将数组元素的索引作为第二个参数传递给回调函数,而parseInt会将这个参数解析为基数。因此,需要使用包装函数来避免这个问题。

,要解决parseInt解析八进制数的问题,可以在调用parseInt时使用第二个参数指定基数为十进制。如果觉得这种写法繁琐,也可以使用自定义包装函数来调用parseInt并填充常量参数。另外,在函数式表达式中使用parseInt时,需要使用包装函数来避免解析错误。

0
0 Comments

问题出现的原因是JavaScript中的parseInt函数在处理以0开头的字符串时会被解析为八进制数。解决方法是使用双波浪线运算符(~~)进行转换,这样就可以避免parseInt的八进制行为。

如果你确定数值是在带符号的32位整数范围内,那么使用~~x可以在所有情况下得到正确的结果。

~~"08" === 8

~~"foobar" === 0

~~(1.99) === 1

~~(-1.99) === -1

如果查看二进制非(~)的规范,规范要求对参数进行"ToInt32"转换,这样可以将NaN值强制转换为零。

是的,这样做非常巧妙,但非常方便...

为什么需要两个操作,一个二进制或就足够了吗?

为什么一个就足够呢?

为什么在|0中的0是一个字符串?

这个问题的整体内容都是关于替代parseInt将字符串转换为整数的方法。因此:总是使用替代方法。

0
0 Comments

这是一个常见的JavaScript陷阱,有一个简单的解决方法:

只需要指定基数,也就是'radix',就像这样:

parseInt('08', 10); // 8

你也可以使用Number:

Number('08'); // 8

Number需要在08周围加上引号。另外需要注意的是,Number('08.123')将产生8.123作为其输出。如果你真的想要一个整数,不要使用Number(或者对输入进行模式匹配以确保只有整数)。

Number(08); 在Firefox和IE中给我返回8。

这不是ECMAscript标准的一部分。我在使用Spidermonkey 1.7(Firefox JS引擎)的JSDB上进行测试时,会出现"08 is not a legal ECMA-262 octal constant"的错误。

尽管如此,仍然使用带引号的'08'。08不符合ECMA-262标准,不能保证不会出现警告、错误或者特定的行为。

虽然这是一个旧问题,但请注意,Number与parseInt是不同的:stackoverflow.com/a/4090577

0