你所不知道的Number()、parseInt()、parseFloat()转换细则

news2024/11/25 16:31:16

为什么要写这篇文章

最近在阅读《javascript高级程序设计》(第6版)这本书,以写代记。同时刚刚入职新公司,发现自己对于number类型转换的细节掌握不足

使用场景

我们常常对于很多字符串类型的数字需要转换成Number,一般使用Number(),就可以实现,但是Number()有一些弊端,比如使用Number()一旦含有非数字类型就会返回NaN,比如Number(’123b’)—>NaN,其实很有可能我们的目的是筛选出字符串中的数值,然而他却返回了NaN,导致条件无法满足,程序无法执行。所以根据不同的场景和目的,会使用不同的数值转换函数:

  • Number(string) :适用于只包含数字的转换
  • parseInt(string, radix) :适用于整数,进制数值转换,含num+非num的转换
  • parseFloat(string) :适用于浮点数的转换

注意: 这里的parseInt()和parseFloat(),与Number.parseInt()Number.parseFloat()相同

思维导图

个人习惯,每次记录一些东西喜欢先用思维导图,一个是简单直观,还有一个是缕清思路,见者不喜勿怪哈

Number(string)

区别于New Number()

new Number()表示Number实例Number()表示Number函数

  • 简单判断:开头是否存在new,有new—实例,无new—函数
  • 深度判断:使用关键字来判断,比如typeofinstanceof ,具体可以参考判断js数据类型的常用方法
new Number(123) instanceof Number; // true

Number('123') instanceof Number; // false 

区别:

转换规则

1.如果是Boolean类型,truefalse将分别转换为10
2.如果是数字值,只是简单的传入和返回
3.如果是null,会返回0
4.如果是undefined,返回NaN
5.如果是对象,则调用对象的valueOf()方法,然后参考**string转换成number规则**
6.如果是字符串,遵守以下规则

  • string转换成number规则1.如果字符串只包含数字,则转换为十进制数值2.如果包含有效浮点数,则会转换对应浮点数值3.如果字符串包含有效的进制格式,则会转换成对应的十进制4.如果字符串前面为0,会被忽略5.如果字符串是空的,则转换成06.如果字符串中包含上述格式之外的字符,则转换成NaN
// 整数
Number('123') // 123

// 浮点数
Number('12.5') // 12.5

// Boolean
Number(true) // 1
Number(false) // 0

// null
Number(null) // 0

// undefined
Number(undefined) // NaN

// string
// 十六进制
Number('0xA') // 10

// 二进制
Number('0b101') // 5

// 八进制
Number('056') // 56,0被忽略,默认为十进制

// 无效进制
Number('0xDFI') // NaN

// ' '
Number(' ') // 0

// 其他
Number('123blue') // NaN
Number('blue') // NaN 

控制台输出结果

parseInt(string, radix)

  • string:表示被转换的类型,一般为string类型
  • radix:进制值,默认为十进制

MDN的解释为:

string

要被解析的值。如果参数不是一个字符串,则将其强制转化为字符串。字符串开头的空白符将会被忽略。

radix 可选

236 的整数,表示进制的基数。如果超出这个范围,将返回 NaN。假如 radix 未指定或者为 0,除非数字以 0x0X 开头(此时假定为十六进制 16),否则假定为 10(十进制)。

转换规则:

1.从左至右解析,直到遇到非数字字符
2.若后面有值,会忽略前面的空格和0
3.如果第一个非空格的值不是数字或者负号,返回NaN
4.空字符串会转换成NaN
5.如果是浮点数,会舍弃小数点后面的数
6.若是有效的十六进制,前面的0是不会被忽略的
7.使用进制转换时,最好传入radix(按x进制转换),否则很有可能解析不成功,因为parseInt()不会自动识别此为几进制数

parseInt('123') // 123

// 浮点数
parseInt('12.56') // 12

// 空格
parseInt(' ') // NaN

// '0'
parseInt('0') // 0

// 0+num
parseInt('0123') // 123

// ' '+num
parseInt(' 123') // 123

// num+str
parseInt(' 123Nmu') // 123

// num+str
parseInt(' num90') // NaN

// 十六进制
parseInt('0xF') // 15

// 八进制 056:46
parseInt('056') // 56,0被忽略

parseInt('056', 8) // 46

// 二进制 0b101:5
parseInt('0b101') // 0

parseInt('0b101', 2) // 0,还是按照字符串解析

parseInt('101', 2) // 5 

控制台输出结果

关于进制解析

从控制台输出结果可以得出的结论是:如果不传第二个参数,只会十六进制会被解析成功,其他进制会当作string转换处理。

《javascript高级程序设计》(第6版)书中是这样子解释的:

在使用parseInt()解析把八进制字面量的字符串时,ECMAScript3和5存在分歧。例如:

// ECMAScript3认为是56(八进制),ECMAScript5认为是70(十进制)
var num = parseInt('070') 

为了消除上诉困惑,为parseInt()提供第二个参数:转换时使用的基数(即多少进制),为了避免错误的解析,我们建议无论什么情况都明确指定基数

题外之话:此书虽然出版时间较早,但是书里面的知识都比较经典,技术也许更新迭代很快,但是万变不离其宗,毕竟参考书中的建议,解析进制数时,是不会出错的(个人的一点小见解)

parseFloat(string)

parseInt()解析规则类型,区别在于parseFloat()可以解析浮点数,关于浮点数的解析规则为:

第一个小数点是有效的,第二个小数点无效

parseFloat('123.456.78'); // 123.456 

与parseInt()的区别:

1.可以转换浮点数
2.前导数0始终会被忽略
3.只能解析十进制数,其他进制会按照string规则解析
4.如果一个值没有小数点或者小数点后都是0,会解析会整数

parseFloat('0xF'); // 0

parseFloat('0b101'); // 0

parseFloat('056'); // 56

parseFloat('0abc'); // 0

// 科学计数法
parseFloat('3.125e7'); // 31250000 

控制台输出结果

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023春节,蔚来高速免费换电累计达37万余次

2023年春节放假前,蔚来官方宣布高速换电免费消息: 在高速公路上(含高速出入口)的所有蔚来汽车换电站将为蔚来用户,提供不限次免费换电服务。 消息发布后,部分电动车企也进行了跟进,提供了特定区…

二十四、Gtk4-GtkExpression

GtkExpression是一种基本类型。它不是GObject的后代。GtkExpression提供了一种描述对值的引用的方法。GtkExpression需要求值才能获得值。 它类似于算术计算。 1 2 3 12是一个表达式。给出了计算的方法。3是来自表达式的值。求值是计算表达式并得到值。 GtkExpression是一种…

【大厂高频真题100题】《有效的井字游戏》 真题练习第26题 持续更新~

有效的井字游戏 给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。 井字游戏的棋盘是一个 3 x 3 数组,由字符 ,X 和 O 组成。字符 代表一个空位。 以下是井字游戏的规则: 玩家轮流将字符…

CODESYS开发教程10-文件读写(SysFile库)

今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。 前面一期我们介绍了CODESYS的文件操作库CAA File。这一期主要介绍CODESYS的SysFile库所包含的文件读写功能块,主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、写、拷贝…

mysql数据库安装

三种安装方式 tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# ls apache-zookeeper-3.6.3-bin kafka_2.12-2.8.1.tgz apache-zookeeper-3.6.3-bin.tar.gz mysql…

无线局域网

无线局域网(Wireless Local Ara Network,WLAN) 一、无线局域网的组成 无线局域网可分为两大类:(1)有基础设施的;(2)无基础设施的。 1. IEEE802.11 对于有基础设施的无…

Spring boot 实战指南(三):整合Elasticsearch、swagger、redis、mq

文章目录一、Elasticsearch创建项目配置maven完善依赖es连接配置实体映射repositoryservicecontroller二、swagger依赖启动类路径匹配配置配置类controller注解三、redis一、Elasticsearch 官方文档 Elasticsearch教程 自己搭建了一个简单的demo,仓库在这里&#…

分布式之CAP理论分析

写在前面 任何存在的事物都有其内在的特性,分布式也不例外,那么分布式都有什么特性呢?国外有大牛就帮我们总结了如下的三点: C:Consitency,一致性 A:Available,可用性 P:Partition tolerance&…

细讲一个 TCP 连接能发多少个 HTTP 请求(二)

第三个问题:一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)? HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,意思是说:两…

测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢

最近发生了一起生产事故,究其根源,事故本身属于架构或者需求层面需要规避的问题,测试人员的责任其实是非常小的,但实际情况是:相关测试人员因此承担了很大的压力,成为质量问题的“背锅侠”。 实际上&#…

极验2代验证码分析

目标链接 aHR0cDovL3d3dy5qc2dzai5nb3YuY246NTg4ODgvbWluaS9uZXR3ZWIvU01MaWJyYXJ5LmpzcA接口分析 点击搜索就会跳出验证码,netWebServlet.json 的请求,会返回 challenge 和 gt 接着可以看响应请求图片信息的接口,可以看到请求参数包含cha…

iOS 组件化或SDK时对资源加载注意点

本文针对cocoapods进行打包的资源做个讲解,针对自身项目注意调整资源访问策略。 资源文件打包方式 使用pod lib create AppResourceModule 来进行演示。 use_frameworks! target AppResourceModule_Example dopod AppResourceModule, :path > ../ end podfil…

Python+Flask+MySQL开发的在线外卖订餐系统(附源码)

文章目录一、项目模块及功能介绍1、登录模块2、注册模块3、商家用户模块4、买家用户模块5、系统管理员模块源码二、项目结构三、环境依赖四、运行方法五、系统部分界面展示1、首页2、注册界面3、登录界面4、商家主界面5、商家菜单界面6、商家添加菜品界面7、商家修改菜品界面8、…

数值程序分析

原文来自微信公众号“编程语言Lab”:数值程序分析 搜索关注“编程语言Lab”公众号(HW-PLLab)获取编程语言更多技术内容! 欢迎加入编程语言社区 SIG-程序分析,了解更多程序分析相关的技术内容。 加入方式:添…

实现自动化部署前端项目,从安装Jenkins到部署完成的整体配置 --适合初学Jenkins、想实现或者学习自动化部署的同学,知识点比较全面,过程写的清晰

前言 一、什么是Jenkins 二、Jenkins安装配置 Linux环境安装JDK Linux环境安装Maven Linux安装Jenkins 启动Jenkins jenkins配置 配置汉化版的jenkins 安装gitHub插件 gitHub配置 jenkins的配置 jenkins的gitHub配置 jenkins的java环境配置 小总结 两种情况 第…

RPCMon:一款基于ETW的RPC监控工具

关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具,该工具是一款GUI工具,可以帮助广大研究人员通过ETW(Event Tracing for Windows)扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图,该…

谋变2023:家电巨头进击的“三大关口”

2022年的中国家电行业,无疑在艰难中前行。奥维云网(AVC)推总数据显示,2022年中国家电市场(不含3C)零售额为7081亿元,同比下滑7.4%。下滑背后的推力是多样的,包括地产市场下行、消费者…

服务端返回内容跨域CORS之后,也在chrome/edge浏览器里显示出响应信息

由于浏览器的同源策略,服务端返回的内容跨域,且没有允许跨域CORS的请求头之后,浏览器无法显示出服务端返回的信息,不方便问题排查。比如:Access to XMLHttpRequest at http://localhost:6001/service-app/query/common…

springcloud-工程创建(IDEA)

文章目录介绍springcloud 常用组件1.创建父工程2.删除父工程的src目录3.修改父工程的pom文件4 springcloud 版本依赖5.创建子模块6 子项目下创建启动类介绍 Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为开发中的配置管理、服务发现、断路器、智…

最全面的内网open虚拟专用网络通道搭建过程

内网open虚拟专用网络通道搭建过程 文章目录内网open虚拟专用网络通道搭建过程前言一、环境准备二、安装open虚拟专用通道2.1、安装依赖包2.2、开始安装三、证书配置3.1、easy-rsa配置修改3.2、初始化与创建CA根证书3.3、生成服务端证书3.4、生成客户端证书3.5、创建服务端配置…