【第1090期】JavaScript 字符串转数字:陷阱
来源:互联网 发布:中学美工课教案 编辑:程序博客网 时间:2024/05/16 18:01
前言
今日早读文章由众成翻译@陈龙20155翻译分享。
正文从这开始~
有很多种方式可以将字符串转为数字。我能想到的方式就至少有 5 种!
parseInt(num); // 默认方式 (没有基数)
parseInt(num, 10); // parseInt 使用基数 (十进制)
parseFloat(num) // 浮点型
Number(num); // Number 构造函数
~~num // 按位取反
num / 1 // 被 1 除
num * 1 // 被 1 乘
num - 0 // 减 0
+num // 一元操作 "+"
该使用哪种方式?什么时候?为什么?这得分析每一种方式和使用它们时常见的陷阱。
根据 JsPerf.com 上的 benchmarks 一组测试表明,大多数浏览器都对 ParseInt 做过优化。虽然它可能是最快的一种方式,但是有可能会引起以下几种错误:
parseInt('08') // 在一些老的浏览器里会返回 0
parseInt('44.jpg') // 返回 44
parseInt:总是使用基数 = parseInt(num, 10);如果你不想让它从字符里面推断数值,就不要使用它。
PareseFloat 又如何呢?它在不处理 16 进制数字的时候,都发挥的很好;例子:
parseInt(-0xFF) // returns -255
parseInt("-0xFF") // returns -255
parseFloat(-0xFF) // returns -255
parseFloat("-0xFF") // returns 0
(注, 一个负 16 进制数字符串是比较特殊的例子,当你在应用中解析它的时候,可能会导致意想不到的错误。 永远记得在应用中检查 NaN 值,以避免出现意外。)
另外, 当数字中含有字符时它会产生跟 parseInt 一样的错误:
`parseFloat('44.jpg') // returns 44`
parseFloat: 处理 16 进制数字的时候需要注意;如果你不想让它从字符里面推断数值,就不要使用它。"
另外一种方法是 “按位取反” (~)。您仅可以使用它将字符串转换为整型,而不能转为浮点型数字。它比较好的一面是,当碰到非数字字符的时候,它会返回 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;对于没有引号的 16 进制数来说,是一样的)
Number 函数同样也是 JsPerf 测试结果里最慢的方法。
Number, 建议不要使用
最后一种方式:一元操作。
"1.23" * 1 // returns 1.23
"0xFF" - 0 // returns 255
"0xFF.jpg" / 1 // returns NaN
+"023" // returns 23
不像其它方式,一元操作会在处理非数字时,抛出一个 NaN 值。这也是我最喜欢的一种方式,因为一个字符不应该被考虑为 0 或者从它有多少位来猜测。大多数时候我会使用 + 操作,因为它是最不容易引起混乱的操作。不过一元操作并不是性能最好的一种方式 ——— 即使 -0 操作性能不错。
字符串转数字最好的方式?
负 16 进制数是唯一在字符串中断开的数字。其它的数字应首先解析成字符串,然后通过一元操作或者带有基数的 parseInt 来解析成数字。parseFloat 具有性能上的优势,但是它会在相较于返回 NaN 更为合适的情况下返回一些数字。
最后,为你推荐:
【第1045期】原生 JavaScript 值得学习吗?答案是肯定的
关于本文
译者:@陈龙20155
译文:http://zcfy.cc/article/converting-strings-to-number-in-javascript-pitfalls-example-4301.html
作者:@jjperezaguinaga
原文:https://coderwall.com/p/5tlhmw/converting-strings-to-number-in-javascript-pitfalls
- 【第1090期】JavaScript 字符串转数字:陷阱
- JavaScript 字符串转数字:陷阱(示例)
- JavaScript 字符串转数字:陷阱(示例)
- javascript 字符串转数字
- JavaScript字符串转数字
- JavaScript字符串转数字
- javascript字符串转数字
- javascript字符串转数组
- 【第1081期】JavaScript 浮点数陷阱及解法
- JavaScript字符串转数组(升级)
- javascript 字符串转数字----简单的一个表达式
- javaScript(二)_特点,变量声明,字符串转数字
- 从字符串转数字
- js字符串转数字
- CString 字符串 转数字
- 字符串转数字
- 罗马字符串转数字
- java字符串转数字
- 破解Myeclipse6.0
- js基础
- 编写一个ImageLoder的实体类
- 电子商务javaweb b2b b2c o2o平台
- AngularJS+查询+敏感字+排序+添加
- 【第1090期】JavaScript 字符串转数字:陷阱
- 二次采样
- vscode 将在下个稳定版本换回蓝色 logo!
- python __name__属性带来命名空间问题
- Banner实现无限轮播
- 为什么不使用MCV
- Failed to read artifact descriptor for xxx:jar:版本号
- 【百钱百鸡】鸡的数量并不能从1开始!!
- 【Spring】 (4)bean的 声明周期内创建初始化和销毁方法