在Javascript中,将字符串转换为数字: 陷阱(例子)

・4 分钟阅读

将字符串转换为数字的方法有很多,我可以想出至少5种方法将字符串转换成数字!


parseInt(num); // default way (no radix)
parseInt(num, 10); // parseInt with radix (decimal)
parseFloat(num) // floating point
Number(num); // Number constructor
~~num //bitwise not
num / 1 // diving by one
num * 1 // multiplying by one
num - 0 // minus 0
+num // unary operator"+"

使用哪一个?

根据JsPerf.com中的几个基准测试,大多数浏览器对ParseInt有最佳响应,虽然这可能是最快的,但是,下面是ParseInt的一些常见错误:


parseInt('08') // returns 0 in some old browsers.
parseInt('44.jpg') // returns 44

parseInt始终将radix = parseInt(num ,10) 一起使用,如果不想让它在字符中猜测,就不要使用它

如果你从来没有处理十六进制数字,那么,举个例子:


parseInt(-0xFF) // returns -255
parseInt("-0xFF") // returns -255
parseFloat(-0xFF) // returns -255
parseFloat("-0xFF") // returns 0

(注意,字符串中的负十六进制数字是一种特殊情况,如果您要解析它,它将在您的应用程序中funky town。确保始终检查应用程序中的NaN值以避免意外的出现。

另外,parseInt的保留问题,包含数字的字符:

parseFloat('44.jpg') // returns 44

**parseFloat:要小心十六进制数字,如果不想从字符中猜测,请不要使用它。",

下一个是按位非(~),你可以使用它将字符串转换为整数,但是,不用于浮点数,它的优点是,如果一个字符出现,它将返回"0"


~~1.23 // returns 1
~~"1.23" // returns 1
~~"23" // returns 23
~~"Hello world" // returns 0

''翻转"每一位,也被称为数字的A1补吗。",你可以使用,但是,要注意它只存储整数,所以,不要使用它,除非你确定你的数字在有符号的32位整数的值之间(这是因为在规范中调用了ToInt32)。

按位非,用它时,确保输入中没有字符,仅用于整数,

那么Number呢? 有同样的问题,解析*的方式是它会试图找出你给它的数字?


Number("023") // returns 23
Number(023) // returns 19

注023实际上是一个八进制数 不管你做什么它都会返回19 对于没有双引号或单引号的十六进制字符来说,

Number也是JsPerf中最慢的结果之一。

Number,几乎不使用它

最后一个是一元运算符。


"1.23" * 1 // returns 1.23
"0xFF" - 0 // returns 255
"0xFF.jpg" / 1 // returns NaN
+"023" // returns 23

其他的不同,一元操作符会很乐意给你一个NaN值,如果他们看到任何funky的东西,它们是我最喜欢的数字转换方法,因为任何带有字符的东西,都不应根据它有多少个数字,而被认为既不是0也不是"猜测,我大部分时间选择 操作符,因为它是最不容易混淆的,虽然-0已经取得了不错的成绩,但它们并没有最好的表现。

方玉 profile image