(点击上方公众号,可快速关注)

英文: Jose Jesus Perez Aguinaga 译文:众成翻译

zcfy.cc/article/converting-strings-to-number-in-javascript-pitfalls-example-4301.html

有很多种方式可以将字符串转为数字。我能想到的方式就至少有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 值,以避免出现意外。)

另外js字符串转化为数字, 当数字中含有字符时它会产生跟 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 进制数来说js字符串转化为数字,是一样的)

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 更为合适的情况下返回一些数字。

看完本文有收获?请转发分享给更多人

关注「前端大全」,提升前端技能

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688

String 转换为 Number 有很多种方式,我可以想到的有 5 种!

<code class="js language-js hljs javascript" style="overflow-wrap: break-word;margin: 0px 2px;line-height: 18px;font-size: 14px;font-weight: normal;word-spacing: 0px;letter-spacing: 0px;font-family: Consolas, Inconsolata, Courier, monospace;border-radius: 0px;overflow-x: auto;padding: 0.5em;background: rgb(51, 51, 51) none repeat scroll 0% 0%;color: white;display: block !important;white-space: pre !important;word-wrap: normal !important;word-break: normal !important;overflow: auto !important;">parseInt(num); // 默认方式 (没有基数)
parseInt(num, 10); // 传入基数 (十位数)
parseFloat(num); // 浮点数
Number(num); // Number 构造器
~~num; //按位非
num / 1// 除一个数
num * 1// 乘一个数
num -
0 + // 减去0
    num; // 一元运算符 "+"

选择哪一种呢?什么时候选择它?为什么选择这种它?我们逐一进行分析,并解析每种方式的常见陷阱。

parseInt

根据 JsPerf.com 的基准测试js字符串转化为数字,大多数浏览器对 parseInt 的响应最佳。虽然它是最快的方式,但使用 preseInt 会碰到一些常见陷阱:

parseInt("08"); // returns 0 部分老浏览器.
parseInt("44.jpg"); // returns 44
parseInt: 没有传入基数时,默认是传入的基数为 10 parseInt(num, 10),如果你不知道 num 属性的类型,不要使用 parseInt 进行字符串转数字。

parseFloat

如果你不解析 16 进制数,这是一个非常好的选择。例如:

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

注意:字符串中的负十六进制数字是一个特殊情况,如果你用 parseFloat 解析,结果是不正确的。为了避免程序出现 NaN 的情况,应该检查转化后的值。

js字符串转化为数字_js判断是否为数字_c 判断字符是否为数字

parseFloat("44.jpg"); // return 44

parseFloat: 转换十六进制数时要小心js字符串转化为数字,如果你不知道要转换对象的类型,不要使用 parseFloat。

按位非

可以把字符串转换成整数,但他不是浮点数。如果是一个字符串转换,它将返回 0;

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

这是什么原理?通过翻转每个位,也称为数字的 A1 补码。你可以使用它,但注意只能用来存储整数。所以通常情况不要用它,除非你能确定这个数是在 32 位整数之间的值(因为调用的 ToInt32 的规范)。

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

Number

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

js判断是否为数字_c 判断字符是否为数字_js字符串转化为数字

一元运算符与其它的解析方式不同,如果是一个 NaN 值,那么返回的也是 NaN 。这是我最喜欢的数值转换方式,因为我认为任何带有字符的对象都不应该被视为 0 或者根据他有多少位来“猜”。我基本使用 + 操作符,因为这个方式不容易混淆。虽然 -0 的用法也很好,但它并没有很好的表达转换为数字的本意。

字符串转换为数字的方式总结

负十六进制数字符串转换为数字时。应首先将任何其转换为 String(例如通过 + “” ),然后使用一元运算符或带基数的 parseInt 解析为数字。但是结果不是 NaN 的数值时,使用 parseFloat 更为合适。

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家免费试用!

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688