今天的重点,是数值(Number)对象。


1 概念

Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。

作为构造函数时,它用于生成值为数值的对象:

上面代码中,Number对象作为构造函数使用,返回一个值为1的对象。

作为工具函数时,它可以将任何类型的值转为数值:

上面代码将布尔值false转为数值0

2 静态属性

Number对象拥有以下一些静态属性(即直接定义在Number对象上的属性,而不是定义在实例上的属性)。

  • Number.POSITIVE_INFINITY:正的无限,指向Infinity
  • Number.NEGATIVE_INFINITY:负的无限,指向-Infinity
  • Number.NaN:表示非数值,指向NaN
  • Number.MIN_VALUE:表示最小的正数(即最接近0的正数,在64位浮点数体系中为5e-324),相应的,最接近0的负数为-Number.MIN_VALUE
  • Number.MAX_SAFE_INTEGER:表示能够精确表示的最大整数,即9007199254740991
  • Number.MIN_SAFE_INTEGER:表示能够精确表示的最小整数,即-9007199254740991

ES 6Number对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。

对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的1.00..001,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2-52 次方。

Number.EPSILON实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的:

上面代码解释了,为什么比较0.1 + 0.20.3得到的结果是false

Number.EPSILON可以用来设置“能够接受的误差范围”。比如,误差范围设为 2-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等:

因此,Number.EPSILON的实质是一个可以接受的最小误差范围:

上面的代码为浮点数运算,部署了一个误差检查函数。

3 实例方法

ES 5时代,Number对象有5个实例方法,都跟将数值转换成指定格式有关;在ES 6标准发布之后,又增补了几种方法,下面一一介绍到。

3.1 Number.prototype.toString()

Number对象部署了自己的toString方法,用来将一个数值转为字符串形式:

toString方法可以接受一个参数,表示输出的进制。如果省略这个参数,默认将数值先转为十进制,再输出字符串;否则,就根据参数指定的进制,将一个数字转化成某个进制的字符串:

上面代码中,345一定要放在括号里,这样表明后面的点表示调用对象属性。如果不加括号,这个点会被 JavaScript 引擎解释成小数点,从而报错:

只要能够让 JavaScript 引擎不混淆小数点和对象的点运算符,各种写法都能用。除了为345加上括号,还可以在345后面加两个点,JavaScript 会把第一个点理解成小数点(即345.0),把第二个点理解成调用对象属性,从而得到正确结果;同理,空格加上一个点,或者正数变为小数都是可以的:

这实际上意味着,可以直接对一个小数使用toString方法:

通过方括号运算符也可以调用toString方法:

toString方法只能将十进制的数,转为其他进制的字符串。如果要将其他进制的数,转回十进制,需要使用parseInt方法。

3.2 Number.prototype.toFixed()

toFixed()方法先将一个数转为指定位数的小数,然后返回这个小数对应的字符串:

上面代码中,345345.008先转成2位小数,然后转成字符串。其中345必须放在括号里,否则后面的点会被处理成小数点。

toFixed()方法的参数为小数位数,有效范围为0100,超出这个范围将抛出 RangeError 错误。

由于浮点数的原因,小数5的四舍五入是不确定的,使用的时候必须小心:

3.3 Number.prototype.toExponential()

toExponential方法用于将一个数转为科学计数法形式:

toExponential方法的参数是小数点后有效数字的位数,范围为0100,超出这个范围,会抛出一个 RangeError 错误。

3.4 Number.prototype.toPrecision()

Number.prototype.toPrecision()方法用于将一个数转为指定位数的有效数字:

该方法的参数为有效数字的位数,范围是1100,超出这个范围会抛出 RangeError 错误。

该方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关:

3.5 Number.prototype.toLocaleString()

Number.prototype.toLocaleString()方法接受一个地区码作为参数,返回一个字符串,表示当前数字在该地区的当地书写形式:

该方法还可以接受第二个参数配置对象,用来定制指定用途的返回字符串。该对象的style属性指定输出样式,默认值是decimal,表示输出十进制形式。如果值为percent,表示输出百分数:

如果style属性的值为currency,则可以搭配currency属性,输出指定格式的货币字符串形式:

如果Number.prototype.toLocaleString()省略了参数,则由浏览器自行决定如何处理,通常会使用操作系统的地区设定。注意,该方法如果使用浏览器不认识的地区码,会抛出一个错误:

3.6 Number.isFinite(), Number.isNaN()

ES 6Number对象上,新提供了Number.isFinite()Number.isNaN()两个方法。

Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity

注意,如果参数类型不是数值,Number.isFinite一律返回false

Number.isNaN()用来检查一个值是否为NaN

如果参数类型不是NaNNumber.isNaN一律返回false

它们与传统的全局方法isFinite()isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false

3.7 Number.parseInt(), Number.parseFloat()

ES 6 将全局方法parseInt()parseFloat(),移植到Number对象上面,行为完全保持不变:

这样做的目的,是逐步减少全局性方法,使得语言逐步模块化:

3.8 Number.isInteger()

Number.isInteger()用来判断一个数值是否为整数:

JavaScript 内部,整数和浮点数采用的是同样的储存方法,所以 345345.0 被视为同一个值:

如果参数不是数值,Number.isInteger返回false

注意,由于 JavaScript 采用 IEEE 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位)。如果数值的精度超过这个限度,第54位及后面的位就会被丢弃,这种情况下,Number.isInteger可能会误判:

上面代码中,Number.isInteger的参数明明不是整数,但是会返回true。原因就是这个小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个3被丢弃了。

类似的情况还有,如果一个数值的绝对值小于Number.MIN_VALUE5E-324),即小于 JavaScript 能够分辨的最小值,会被自动转为 0。这时,Number.isInteger也会误判:

上面代码中,5E-325由于值太小,会被自动转为0,因此返回true

总之,如果对数据精度的要求较高,不建议使用Number.isInteger()判断一个数值是否为整数。

3.9 安全整数和 Number.isSafeInteger()

JavaScript 能够准确表示的整数范围在-2^532^53之间(不含两个端点),超过这个范围,无法精确表示这个值:

上面代码中,超出 253 次方之后,一个数就不精确了。

Number.isSafeInteger()则是用来判断一个整数是否落在这个范围之内:

这个函数的实现很简单,就是跟安全整数的两个边界值比较一下。

Number.isSafeInteger = function (n) {return (typeof n === 'number' &&Math.round(n) === n &&Number.MIN_SAFE_INTEGER <= n &&n <= Number.MAX_SAFE_INTEGER);
}

实际使用这个函数时,需要注意。验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值:

上面代码中,9007199254740993不是一个安全整数,但是Number.isSafeInteger会返回结果,显示计算结果是安全的。这是因为,这个数超出了精度范围,导致在计算机内部,以9007199254740992的形式储存:

所以,如果只验证运算结果是否为安全整数,很可能得到错误结果。下面的函数可以同时验证两个运算数和运算结果:

4 自定义方法

与其他对象一样,Number.prototype对象上面可以自定义方法,被Number的实例继承:

上面代码为Number对象实例定义了一个add方法。在数值上调用某个方法,数值会自动转为Number的实例对象,所以就可以调用add方法了。由于add方法返回的还是数值,所以可以链式运算:

上面代码在Number对象的实例上部署了subtract方法,它可以与add方法链式调用。

我们还可以部署更复杂的方法:

上面代码在Number对象的原型上部署了iterate方法,将一个数值自动遍历为一个数组。

注意,数值的自定义方法,只能定义在它的原型对象Number.prototype上面,数值本身是无法自定义属性的:

上面代码中,n是一个原始类型的数值。直接在它上面新增一个属性x,不会报错,但毫无作用,总是返回undefined。这是因为一旦被调用属性,n就自动转为Number的实例对象,调用结束后,该对象自动销毁。所以,下一次调用n的属性时,实际取到的是另一个对象,属性x当然就读不出来。

javascript 判断为负数_JavaScript从零开始——标准库(7)相关推荐

  1. cryptojs aes加密每次结果不同_Javascript加密算法标准库,支持Nodejs+浏览器——crypto-js...

    介绍 crypto-js是一个前端Javascript标准加密算法库,CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法.有时候项目涉及到的敏感数据比较多,为 ...

  2. python标准库os中用来列出_雨课堂答案在哪查,雨课堂2020试题及答案

    常用的电镜有 和 两种,观察表面结构用 ,观察内部结构用 . [简答题]发票号码是否正确?如错误,请修改. [简答题]桥壳的功用有哪些? 在正常窦性心律的心电图上,同-导联连续出现两次或两次以上QRS ...

  3. python几次方函数_Python标准库math中用来计算x的y次方的函数是pow(x,y)。

    [判断题]Python表达式int("110", 2)的值为6. [单选题]关于 Python 的复数类型,以下选项中描述错误的是( ). [判断题]现代物流管理以实现顾客满意为第 ...

  4. python random包含尾部吗_Python标准库random的方法randint(m,n)用来生成一个[m,n]区间上的随机整数。...

    [判断题]已知列表 x = [1, 2, 3],那么执行语句 x = 3 之后,变量x的地址不变 [判断题]只能对列表进行切片操作,不能对元组和字符串进行切片操作 [单选题]Which is not ...

  5. 对象数组参数_【JavaScript 教程】标准库—Array 对象

    作者 | 阮一峰 1.构造函数 Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组. var arr = new Array(2);arr.length // ...

  6. JavaScript权威指南7(四) 第十一章 JavaScript 标准库

    Set和Map类 用于表示一组值以及从一组值到另一组值的映射. set 是值得集合,就像数组.但不同于数组,set 没有被排序或索引,并且它们不允许重复:值要么是集合的成员要么不是集合的成员,不能知道 ...

  7. 后端返回number类型数据_【JavaScript 教程】标准库—Number 对象

    作者 | 阮一峰 1.概述 Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用. 作为构造函数时,它用于生成值为数值的对象. var n = new Number(1) ...

  8. Python标准库判断图片文件和声音文件的格式

    每种文件都有自己独特的文件头结构和数据组织形式,这些都会在specification中进行详细说明和描述. GIF文件的头结构比较简单,前4个字节是GIF8,例如: 但是其他图片文件的结构就复杂很多了 ...

  9. 《JavaScript权威指南第7版》第11章 JavaScript标准库

    第11章 JavaScript标准库 11.1 Set和Map 11.1.1 Set类 11.1.2 Map类 11.1.3 WeakMap和WeakSet 11.2 类型数组和二进制数据 11.2. ...

最新文章

  1. 033_CSS相对定位
  2. 【数据结构-树】4.图解平衡二叉树和哈夫曼编码(逐步演绎,一文读懂)
  3. html字体颜色自动变化,js设置字体颜色_自动改变文字大小和颜色的js代码分享
  4. reactjs组件通讯:父组件传递数据给子组件
  5. 1.7 空间正交分解
  6. MyBatis总结七:动态sql和sql片段
  7. 从字符串 const str = ‘qwbewrbbeqqbbbweebbbbqee‘;中能得到结果 [“b“, “bb“, “bbb“, “bbbb“] 以下错误语句是?
  8. 复旦提出GaitSet算法,步态识别的重大突破!
  9. [NHibernate]一对多关系(级联删除,级联添加)
  10. Ubuntu 16.04 安装 NVIDIA GeForce GTX 1060 显卡驱动,以及 CUDA 10.1
  11. 【计算机网络】传输层 : 传输层概述 ( 设备层级 | 传输层功能 | TCP 协议 | UDP 协议 | 复用与分用 | 端口号 | 套接字 )
  12. jpg图片太大怎么压缩?jpg图片怎么压缩大小?
  13. office2007无法使用宏的解决方法
  14. 深度学习框架之Keras入门教程
  15. 三小时,破解数据库智能管控中的奥秘
  16. 人工智能接口调试(百度AI|腾讯AI)
  17. 一场来自于国内企业网盘间的战争
  18. 大智慧、通达信winner函数python代码实现
  19. 欧创芯原装OC 6701关断时间可调,智能过温保护芯片,SOP8 封装
  20. ncnn环境搭建一 - windows下protobuf编译安装

热门文章

  1. 使用poi写入doc文档中文档打不开_基于NodeJS和浏览器的PDF文档引擎——PDFKit
  2. java 静态内存图
  3. QGraphicsItem获取不到鼠标事件
  4. python循环实验心得_2019.06.18学习python循环总结
  5. 一文总结:抽象类(abstract)与接口(interface)的特点和代码展示
  6. keras concatenate_Keras结合Keras后端搭建个性化神经网络模型
  7. 酷狗音乐怎样复制歌词到计算机,酷狗怎么复制歌词和歌曲到mp3上
  8. linux-2.6.29内核配置、编译与安装
  9. win10 下用 vs code 编译调试代码的过程 (MinGW)
  10. java 内存空间_怎样用java实现存储空间动态分配