当前位置: 首页 > news >正文

JavaScript数值处理 + 小花样

数值处理

一、StringToNumber

字符到数字的类型转换,存在一个语法结构,支持十进制、二进制、八进制和十六进制比如:

+'30'       // 30
+'ob111'    // 7
+'0o13'     // 11
+'0xFF'     // 255

此外,JavaScript支持的字符串语法还包括正负号科学计数法,可以使用大写或者小写的e来表示:

+'1e3'      // 1000
+'-1e-2'    // -0.01

也可以使用函数Number来显式转换

Number('30')        // 30
Number('0b111')     // 7
Number('0o13')      // 11
Number('0xFF')      // 255
Number('1e3')       // 1000
Number('-1e-2')     // -0.01

特别要注意,表达式所产生的隐式调用并不引用window.Number属性来调用对应的程序,我会在以下(二)中详细解释这个问题。

需要注意的是,parseInt 和 parseFloat 并不使用这个转换,所以支持的语法跟这里不尽相同。这个问题在以下(三)中讨论

二、小花样:window.Number函数与内置Number

先来看一个例子:

1697677-20190712101242493-707549955.png

以上例子说明window的Number属性是可覆写的(writable=true),下面对Number函数进行覆写(实质上是修改Number的指向):

1697677-20190712100827360-994099666.png

覆写之后window.Number失去原有的特性:

1697677-20190712100856211-2007942210.png

(注意第二句new Number(123) 时自定义的return语句会被自动添加return this屏蔽)。但是覆写window.Number后我们还是可以使用以下隐式类型转换

1697677-20190712100914623-518074280.png

这说明了:

  1. 覆写之前Number所指向的程序(记为X)并没有释放,而是继续存在,只修改了window.Number的指向后,无法再用Number属性找到X。但是,隐式类型转换使用的依旧是X,这说明底层c++保留有指向X的指针
  2. 隐式类型转换并没有调用Number()(否则这里应该就输出“覆盖后的Number”了), 准确地说,没有通过window的Number属性变量来对X寻址,而是通过内部的一个变量(假设记为innerNumber,C++不一定使用这个名字)来对X寻址。

1697677-20190712100932256-830272776.png

数字类型的装箱操作也是使用innerNumber来寻址X,而非使用window.Number。利用装箱原理,我们可以找回X

1697677-20190712100950494-1948371492.png

这样,window.Number和innerNumber就都指向X了。

三、parseInt 和 parseFloat

在不传入第二个参数的情况下,parseInt只支持16进制前缀“0x”,而且会忽略非数字字符,也不支持科学计数法。

在一些古老的浏览器环境中,parseInt还支持0开头的数字作为8进制前缀,这是很多错误的来源。所以在任何环境下,都建议传入parseInt的第二个参数,而parseFloat则直接把原字符串作为十进制来解析,它不会引入任何的其他进制。

多数情况下,Number 是比 parseInt 和 parseFloat 更好的选择。

1. parseInt

parseInt 函数将其第一个参数转换为字符串,解析它,并返回一个整数或NaN。如果不是NaN,返回的值将是作为指定基数(基数)中的数字的第一个参数的整数。

例如:radix参数为10 将会把第一个参数看作是一个数的十进制表示,8 对应八进制,16 对应十六进制,等等。基数大于 10 时,用字母表中的字母来表示大于9 的数字。例如十六进制中,使用 AF

如果parseInt的字符不是指定基数中的数字,则忽略该字符和所有后续字符,并返回解析到该点的整数值。parseInt将数字截断为整数值。允许使用前导空格和尾随空格。

一些数中可能包含e字符(例如6.022e23),使用parseInt去截取包含e字符数值部分会造成难以预料的结果。例如:

parseInt("6.022e23", 10); // 返回 6
parseInt(6.022e2, 10); // 返回 602

parseInt不应该用作 Math.floor()的替代品。

如果 parseInt 遇到了不属于radix参数所指定的基数中的字符那么该字符和其后的字符都将被忽略。接着返回已经解析的整数部分。parseInt 将截取整数部分。开头和结尾的空白符允许存在,会被忽略。

在基数为 undefined,或者基数为 0 或者没有指定的情况下,JavaScript 作如下处理:

  • 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
  • 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值
  • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。

如果第一个字符不能被转换成数字,parseInt返回NaN

算术上, NaN 不是任何一个进制下的数。 你可以调用isNaN 来判断 parseInt 是否返回 NaNNaN 参与的数学运算其结果总是 NaN

将整型数值以特定基数转换成它的字符串值可以使用 intValue.toString(radix).

更多细节可在MDN查看:

parseInt

2. parseFloor

parseFloat

四、numberToString

在较小的范围内,数字到字符串的转换是完全符合你直觉的十进制表示。当Number绝对值较大或者较小时,字符串表示则是使用科学计数法表示的。这个算法细节繁多,我们从感性的角度认识,它其实就是保证了产生的字符串不会过长。

具体的算法,你可以去参考JavaScript的语言标准。由于这个部分内容,我觉得在日常开发中很少用到,所以这里我就不去详细地讲解了。

总结

对于window的7种基本数据类型对应的构造函数,如果这些构造可覆写,则隐式类型转换和装箱操作都不会通过window对象里对应的属性(如Number)来寻址目标程序块X,而是通过我们普通方法访问不到的变量来寻址目标程序块X

另外,我们可以利用装箱原理来访问程序块X

补充

箭头函数不能用作构造函数!!!

转载于:https://www.cnblogs.com/wen-k-s/p/11174423.html

相关文章:

  • SQLMap使用总结
  • Redis 学习笔记(篇五):对象(RedisObject)
  • Codevs 3981 动态最大子段和
  • A 小石的签到题
  • 又是问题~~~
  • Sql: 請假跨月份問題,或跨年份問題 日期部分边界
  • OpenFlow通信流程解读
  • React 入门与实战-课时7 虚拟DOM的本质和目的
  • sort函数和next_permutation()函数的用法。
  • 舵机控制原理
  • BZOJ1123 BLO
  • Mac下的PHP的配置与运行
  • 数据映射工具 AssionMapper
  • Navicat 连接MySQL 8.0.11 出现2059错误
  • 牛客练习赛33 C tokitsukaze and Number Game (结论+字符串处理)
  • 4. 路由到控制器 - Laravel从零开始教程
  • gitlab-ci配置详解(一)
  • go append函数以及写入
  • SAP云平台里Global Account和Sub Account的关系
  • SpriteKit 技巧之添加背景图片
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • win10下安装mysql5.7
  • yii2权限控制rbac之rule详细讲解
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 记一次用 NodeJs 实现模拟登录的思路
  • 码农张的Bug人生 - 初来乍到
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 说说动画卡顿的解决方案
  • 微信小程序填坑清单
  • 小程序01:wepy框架整合iview webapp UI
  • 译自由幺半群
  • Semaphore
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​低代码平台的核心价值与优势
  • #FPGA(基础知识)
  • $.proxy和$.extend
  • ( 10 )MySQL中的外键
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (23)Linux的软硬连接
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Python第六天)文件处理
  • (二)springcloud实战之config配置中心
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一) springboot详细介绍
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)ABI是什么