有人可以告诉我为什么var val="08"; alert(parseInt(val-1));
显示7
但var val="08"; alert(parseInt(val)-1);
显示-1?
日Thnx
答案 0 :(得分:1)
始终使用parseInt(val,10);
确保在十进制系统中解析值。
如果您提醒val-1
,即08-1
,那么它是7
,即parseInt(7) ==> 7
但是当你做的时候
parseInt(val)-1 ==> parseInt("08")-1 ==> 0-1 ==> -1
为什么会变成0
?
答案是它假设您要解析八进制数字系统。
所以总是使用第二个参数,即parseInt(whatevervalue,10);
答案 1 :(得分:1)
parseInt("08")
以识别八进制(前导NaN
表示“八进制”), parseInt
将为您0
。如果引擎遵循标准,它会给你8
,标准表示不这样做(从ES5开始)。
parseInt("08"-1)
有点多余,因为表达式"08"-1
将产生一个数字(然后传递给parseInt
);只需"08"-1
即可。这就是崩溃的原因:
引擎通过尝试将"08" - 1
转换为数字来处理表达式"08"
。在一个扩展数字文字语法以包含八进制的引擎上,这会失败,但在没有引擎的引擎上,它会给你8
。所以表达式的结果是数字 7(8 - 1)。
然后引擎执行parseInt(7)
,这是多余的,因为7
已经是一个数字。会发生什么情况7
变为"7"
,然后再解析回7
。
请注意上述差异:parseInt("08") - 1
的结果将根据引擎是否扩展parseInt
将解析的内容而有所不同,但"08" - 1
的结果将根据引擎是否扩展而有所不同数字文字语法。这有两个不同的东西,ES5 specification不允许引擎扩展parseInt
的语法,但 允许它们扩展数字文字语法(参见§B.1.1 }),但仅限于松散模式。 (令人困惑,我知道。)
外卖消息:始终使用parseInt
的基数来告诉它使用的数字基数。