摘要 :JavaScript 是一个神奇的语言,字符串转数字有 5 种方法,各有各的坑法!

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

parseInt(num); // 默认方式 (没有基数)
parseInt(num, 10); // 传入基数 (十位数)
parseFloat(num); // 浮点数
Number(num); // Number 构造器
~~num; //按位非
num / 1; // 除一个数
num * 1; // 乘一个数
num -
0 + // 减去0
num; // 一元运算符 "+"

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

parseInt

根据 JsPerf.com 的基准测试,大多数浏览器对 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 的情况,应该检查转化后的值。

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

parseFloat: 转换十六进制数时要小心,如果你不知道要转换对象的类型,不要使用 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

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

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

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

关于Fundebug

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

版权声明

转载时请注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2018/07/07/string-to-number/

JavaScript字符串转数字的5种方法及其陷阱的更多相关文章

  1. js字符串转换为数字的三种方法。(转换函数)(强制类型转换)(利用js变量弱类型转换)

    js字符串转换为数字的三种方法.(转换函数)(强制类型转换)(利用js变量弱类型转换) 一.总结 js字符串转换为数字的三种方法(parseInt("1234blue"))(Num ...

  2. C++(四)— 字符串、数字翻转3种方法

    1.使用algorithm中的reverse函数,string类型字符建议使用. #include <iostream> #include <string> #include ...

  3. JavaScript进阶(四)js字符串转换成数字的三种方法

    js字符串转换成数字的三种方法 在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b. ...

  4. Java:判断字符串是否为数字的五种方法

    Java:判断字符串是否为数字的五种方法 //方法一:用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str. ...

  5. 用Excel如何将文本转换为数字的七种方法

    用Excel如何将文本转换为数字的七种方法 当下,很多工作都会用到Excel,下面本文分步介绍了如何将包含文本的Excel单元格转换为包含数字的单元格. 概述: 当导入在另一程序(如 dBASE 或  ...

  6. javascript字符串转数字

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. JavaScript 字符串转为数字

    js中字符串转为数字主要4种,分别为转换函数,强制转换,js变量弱类型转换,正则表达式. 1.转换函数 JS中提供了两个转换函数parseInt()和parseFloat(),parseInt()将值 ...

  8. JavaScript中数组去重的几种方法

    JavaScript中数组去重的几种方法 正常情况下,数据去重的工作一般都是由后端同事来完成的,但是前端也要掌握好处理数据的能力,万一去重的工作交给我们大前端处理,我们也不能怂呀.现在我总结了一些去重 ...

  9. C#判断字符串为空的几种方法和效率判断

    C#判断字符串为空的几种方法和效率判断 string定义 1.1 string str1="":会定义指针(栈),并在内存里划一块值为空的存储空间(堆),指针指向这个空间.1.2 ...

随机推荐

  1. Java Bloom filter几种实现比较

    英文原始出处: Bloom filter for Scala, the fastest for JVM 本文介绍的是用Scala实现的Bloom filter. 源代码在github上.依照性能测试结 ...

  2. 理解Golang哈希表Map的元素

    目录 概述 哈希函数 冲突解决 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 - 哈希 ...

  3. java热加载和热部署

    JAVA热部署和热加载 联系与区别 Java热部署与热加载的联系 1.不重启服务器编译/部署项目 2.基于Java的类加载器实现 区别 部署方式 热部署在服务器运行时重新部署项目 热加载在运行时重新加 ...

  4. SQL执行错误#1064---保留字错误

    CREATE TABLE IF NOT EXISTS `change` ( `id` INT NOT NULL AUTO_INCREMENT, `creator` VARCHAR(45) NOT NU ...

  5. RabbitQM使用笔记

    一:安装  and  卸载 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.r ...

  6. Java面试题:小白不得不懂的斐波那契数列

    很长一段时间里,我都非常疑惑:“我写的技术文章不差啊,有内容的同时还很有趣,不至于每篇只有区区几十个人读啊?为什么有些内容简单到只有一行注册码的文章浏览量反而轻松破万?”这样的疑惑如鲠在喉啊!写技术博 ...

  7. Qt之自绘制饼图

    1.说明 最近在搞绘图方面的工作,说实话C++的第三方绘图库并不算多,总之我了解的有:qtcharts.ChartDirector.qwt.kdchart和QCustomPlot.这几个库各有利弊. ...

  8. 在.NET Core console application中使用User Secrets(用户机密)

    微软很坑地只在Microsoft.NET.Sdk.Web中提供了VS项目右键菜单的"管理用户机密"/"Manage User Secrets"菜单项,在使用Mi ...

  9. Unable to build: the file dx.jar was not loaded from the SDK folder

    eclipse 运行 android 时失败了,提示 Unable to build: the file dx.jar was not loaded from the SDK folder! 解决办法 ...

  10. EF架构~migration对mysql数据库的迁移

    回到目录 ef这个orm工具确实强大,无论在实体建模还是在实体关系上,都发挥的很出色,而最近的code first针对数据库变更的使用更让我眼前一亮,先不说对sqlserver的支持,因为mssql本 ...