尝试在JavaScript中执行以下内容:

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

我刚刚得知的JavaScript认为前导零表示硬盘方式的八进制整数和由于在碱-8无"8""9",该函数返回零。喜欢还是不喜欢,这是由设计

哪些解决方法?

注:为了完整起见,我要发布一个解决方案,但它是我最讨厌的,所以请发布其他/更好的答案的解决方案


<强>更新

JavaScript标准的第5版( ECMA-262 )引入了重大更改,消除这种行为。 Mozilla有一个很好的写了

有帮助吗?

解决方案

这是一种常见的疑难杂症的Javascript用一个简单的解决方案:

只需指定基或'基数',如下所示:

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

您也可以使用

Number('08'); // 8

其他提示

如果您了解你的价值将在32位有符号整数的范围,然后~~x会做正确的事的所有方案。

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

如果你查找二进制不(~),该规范需要它执行明显转化为Int32和被指定为强制NaN值到零的说法是“ToInt32”转化率。

是,这是难以置信的hackish但是如此方便...

parseInt函数文档,使用可选的基数参数来指定基-10:

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

这令我迂腐,混乱,以及详细(真的,在每一个parseInt函数一个额外的参数?),所以我希望有一个更好的办法。

function parseDecimal(s) { return parseInt(s, 10); }

编辑:使自己的功能,做你真正想要的,只是如果你不喜欢添加”,10" 所有的时间到parseInt函数()调用的选项。它拥有的是非标准功能的缺点:如果你经常使用它,但也许其他人更加迷惑了你更方便

指定基:

var number = parseInt(s, 10);

难道是非常调皮与假定小数,如果它不具有第二参数的版本替换parseInt函数? (注意 - 未测试)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}

这样如何为十进制:

('09'-0) === 9  // true

('009'-0) === 9 // true
  

您也可以代替使用parseFloat或parseInt函数,使用一元运算符(的 + )。

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

和良好的措施

+"09.09"
// => 9.09

MDN链接

  

在一元加号操作之前它的操作数,并评估为它的操作数,但试图将其转换为一个数字,如果它尚未。尽管一元否定( - )还可以将非数字的一元加号是将一些成多个的最快的和优选的方式,因为它不上号执行任何其他操作

如果您已经做了一堆编码已经与parseInt函数,不希望添加”,10" 的一切,你可以重写功能,使基地10默认:

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

这可能会混淆稍后阅读器,所以制造parseInt10()函数可能更不言自明的。我个人比较喜欢用一个简单的函数不必加”,10" 所有的时间 - 只创造了失误较多的机会。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top