《ES6标准入门》阅读笔记——-number类型的扩展

写在前面

本系列为在我读完阮一峰老师的《ES6标准入门》第二版之后,所做的阅读笔记的整理。

许多初学ES6, 同时和我一样初次阅读阮老师的这本书的时候, 读第一遍会越发的困惑, 因为阮老师上面说的很多的定义,方法,之前都是没有见过的, 读到后面才发现, 哦~原来是这样.

有一句话叫做”大神的世界我们不懂”, 所以我在初读第一遍《ES6标准入门》这本书的时候,也是踩了不少坑,读书的时候查阅了不少的资料.

所以,在这一系列的笔记教程中,我会从一个初学者的角度,向您讲述ES6的相关知识,在后面介绍的知识我会尽量不提前用,即使提前使用,也会同时做好标注,避免了阅读时各种查阅资料的烦恼.

系列博客将采用一个一个的样例,来说明书中的精华部分(当然,这只是我认为的),同时引导新手,快速入门ES6,并逐步将其投入到生产实践中。

同时,在阅读前也提醒您, 为了系统连贯性的学习ES6的基础知识,建议您从我的博客第一章开始阅读,当然,如果您对对应的知识已经有所了解,那么可以跳转到任意章节阅读,每一篇博客名中均有介绍该博客中涉及到的ES6的内容.

阮一峰老师的这本书是开源的,在其官方博客就可以下载到,但是我强烈建议大家去购买一本书, 一是方便自己查阅ES6中新增的众多API, 二也是表达一下对大神的敬仰.

二进制和八进制的新写法

ES6的更新同时带来了二进制和八进制数组的新写法, 分别使用0b 和 0o表示

不同于之前在ES5中,我们使用八进制字面量, 在严格模式下是无效的:

1
2
3
"use strict"
var octalNum = 070
console.log(octalNum)

(不过经过测试,在ES6环境下,这个语句可以正常运行. 这要归功于ES6带来的强大的性能, 这一点需要说明一下)

在ES6环境下,我们可以直接使用

1
2
3
4
5
console.log(0o11 === 011)  // true
'use strict'
console.log(0o11 === 011) // true
console.log(Number('0b111')) // 7
console.log(Number('0o10')) // 8

Number.isFinite()

ES6提供了判断数字是否有穷的方法 Number.isFinite()

到这里很多同学很惊讶,这个isFinite()方法不是应该是ES5所出现的吗?

其实是这样的, 在ES6之前,我们调用这个方法是直接在window 上面调用的, 而在ES6中, 将这些数学方法集成到了Number类中.

1
2
3
4
console.log(Number.isFinite(15))  // true
console.log(Number.isFinite('15')) // false
console.log(Number.isFinite(NaN)) // false
console.log(Number.isFinite(Infinity)) // false

需要注意的是,当我们传入字符串进去的时候,是不会对我们传入值进行隐式类型转换的

Number.isNaN()

同样的, 本来之前在window上面的方法isNaN()也被同时放到了Number类上

1
2
3
4
console.log(Number.isNaN(NaN)) // true
console.log(Number.isNaN(15)) // false
console.log(Number.isNaN('15')) // false
console.log(Number.isNaN('true' / 'true')) // true

两种方法的区别

那么,为了遵循线性增强的规则, ES6中也保留了在ES5中的之前的方法. 但是两种方法是存在区别的, 最大的区别在于, Number类下的方法不会进行隐式类型转换

1
2
3
4
console.log(isFinite(25))  // true
console.log(isFinite('25')) // true
console.log(Number.isFinite(25)) // true
console.log(Number.isFinite('25')) // 因为不存在隐式类型转换的过程,所以这里打印值为false

综上所述, ES6在数值类上的一个创新是,将一些数组类的全局方法逐步转移到Number类型下来,从而达到逐步减少全局方法的目的,实现语言的逐步模块化

1
console.log(Number.parseFloat === parseFloat) // true

Number.isInterger()

Number.isInterger() 方法,用来判断一个值是否为整数,需要注意的是,在javascript内部,整数和浮点数是采用的相同的存储方法的,所以3 和 3.0 其实是全等的

1
2
3
4
console.log(3 === 3.0)
console.log(Number.isInteger(3))
console.log(Number.isInteger(3.0)) // true
console.log(Number.isInteger(3.1)) // false

Number.EPSILON

Number.EPSILON 是Number对象引入的一个极小的常量,目的在于解决浮点数计算不精确的问题

1
2
3
4
5
6
console.log(Number.EPSILON) //2.220446049250313e-16
// 当两者相减,误差小于Number.EPSILON的时候,我们可以判定两数是完全相等的
function equal(num1, num2) {
return Math.abs(num1 - num2) < Number.EPSILON ? true : false;

console.log(equal(.1 + .2, .3)) // true

要知道,在这之前, .1 + .2 != .3 因为浮点的运算精度问题,导致出现了一点点的小误差

安全整数

javascript可以准确地表示在2的负53次方到2的正53次方之间的整数,超出则无法精确显示

1
console.log(Math.pow(2, 53) === Math.pow(2, 53) - 1) // 返回的是false,书上的有问题

数学对象处理的其他方法

在ES6中,新增了17个对数学对象处理相关的方法

Math.trunc() 用于取出一个数的小数部分,返回整数部分
Math.sign() 用于判断一个数到底是整数,还是负数,还是零
Math.cbrt() 用于计算一个数的立方根
Math.clz32() 用于返回一个数的32位二进制的数值表示的数,前面有多少个前导零
Math.imul() 返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位带符号整数
Math.fround()返回数值的单精度浮点数的数值表示,也就是以64位存储的浮点数
Math.hypot() 返回所有参数的平方和的平方根
Math.expm1(x) 返回其相应的指数减一 即 e ^ x -1
Math.log1p(x) 返回 ln(1+x) 等价于 Math.log(1 + x)
Math.log10(x) 返回以10为底的对数
Math.log2() 返回以2为底的对数

下面是打印出来的测试用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
console.log(Math.trunc(4.9)) //4
console.log(Math.trunc(-4.9)) //-4
console.log(Math.sign(5)) //1 (表示是正数)
console.log(Math.sign(-0)) //-0 表示是负零
console.log(Math.sign(0))
console.log(Math.sign()) //NaN 表示为非数值
console.log(Math.cbrt(8)) //2
console.log(Math.clz32(1)) //31 表示1的32位二进制的数值,1前面一共有21个零
console.log(Math.clz32(1.9)) //31 对于有小数的情况,只返回相应的整数部分
console.log(Math.clz32(NaN)) //32 此方法有隐式类型转换的机制
console.log(Math.imul(2, 4)) // 8
console.log(Math.fround(1.337)) //1.3370000123977661 丧失了精度
console.log(Math.hypot(3, 4)) //5
console.log(Math.expm1(0)) //0
console.log(Math.expm1(1)) //1.718281828459045
console.log(Math.log10(10)) //1.718281828459045
console.log(Math.log2(2)) //1.718281828459045

指数运算符

ES7还新增了一个指数运算符,目前babel转码器已经支持

1
2
3
4
5
6
7
console.log(2 ** 2) //4
console.log(2 ** 3) //8
// 同时,指数运算符还可与等号结合,形成一个新的赋值运算符 **=
let a = 3
console.log(a **= 2) // 9
let b = 2
console.log(b **= 3) // 8

(完)

文章目录
  1. 1. 写在前面
  2. 2. 二进制和八进制的新写法
  3. 3. Number.isFinite()
  4. 4. Number.isNaN()
  5. 5. 两种方法的区别
  6. 6. Number.isInterger()
  7. 7. Number.EPSILON
  8. 8. 安全整数
  9. 9. 数学对象处理的其他方法
  10. 10. 指数运算符
|