写在前面
本系列为在我读完阮一峰老师的《ES6标准入门》第二版之后,所做的阅读笔记的整理。
许多初学ES6, 同时和我一样初次阅读阮老师的这本书的时候, 读第一遍会越发的困惑, 因为阮老师上面说的很多的定义,方法,之前都是没有见过的, 读到后面才发现, 哦~原来是这样.
有一句话叫做”大神的世界我们不懂”, 所以我在初读第一遍《ES6标准入门》这本书的时候,也是踩了不少坑,读书的时候查阅了不少的资料.
所以,在这一系列的笔记教程中,我会从一个初学者的角度,向您讲述ES6的相关知识,在后面介绍的知识我会尽量不提前用,即使提前使用,也会同时做好标注,避免了阅读时各种查阅资料的烦恼.
系列博客将采用一个一个的样例,来说明书中的精华部分(当然,这只是我认为的),同时引导新手,快速入门ES6,并逐步将其投入到生产实践中。
同时,在阅读前也提醒您, 为了系统连贯性的学习ES6的基础知识,建议您从我的博客第一章开始阅读,当然,如果您对对应的知识已经有所了解,那么可以跳转到任意章节阅读,每一篇博客名中均有介绍该博客中涉及到的ES6的内容.
阮一峰老师的这本书是开源的,在其官方博客就可以下载到,但是我强烈建议大家去购买一本书, 一是方便自己查阅ES6中新增的众多API, 二也是表达一下对大神的敬仰.
二进制和八进制的新写法
ES6的更新同时带来了二进制和八进制数组的新写法, 分别使用0b 和 0o表示
不同于之前在ES5中,我们使用八进制字面量, 在严格模式下是无效的:
1 | "use strict" |
(不过经过测试,在ES6环境下,这个语句可以正常运行. 这要归功于ES6带来的强大的性能, 这一点需要说明一下)
在ES6环境下,我们可以直接使用
1 | console.log(0o11 === 011) // true |
Number.isFinite()
ES6提供了判断数字是否有穷的方法 Number.isFinite()
到这里很多同学很惊讶,这个isFinite()方法不是应该是ES5所出现的吗?
其实是这样的, 在ES6之前,我们调用这个方法是直接在window 上面调用的, 而在ES6中, 将这些数学方法集成到了Number类中.
1 | console.log(Number.isFinite(15)) // true |
需要注意的是,当我们传入字符串进去的时候,是不会对我们传入值进行隐式类型转换的
Number.isNaN()
同样的, 本来之前在window上面的方法isNaN()也被同时放到了Number类上
1 | console.log(Number.isNaN(NaN)) // true |
两种方法的区别
那么,为了遵循线性增强的规则, ES6中也保留了在ES5中的之前的方法. 但是两种方法是存在区别的, 最大的区别在于, Number类下的方法不会进行隐式类型转换
1 | console.log(isFinite(25)) // true |
综上所述, ES6在数值类上的一个创新是,将一些数组类的全局方法逐步转移到Number类型下来,从而达到逐步减少全局方法的目的,实现语言的逐步模块化
1 | console.log(Number.parseFloat === parseFloat) // true |
Number.isInterger()
Number.isInterger() 方法,用来判断一个值是否为整数,需要注意的是,在javascript内部,整数和浮点数是采用的相同的存储方法的,所以3 和 3.0 其实是全等的
1 | console.log(3 === 3.0) |
Number.EPSILON
Number.EPSILON 是Number对象引入的一个极小的常量,目的在于解决浮点数计算不精确的问题
1 | console.log(Number.EPSILON) //2.220446049250313e-16 |
要知道,在这之前, .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 | console.log(Math.trunc(4.9)) //4 |
指数运算符
ES7还新增了一个指数运算符,目前babel转码器已经支持
1 | console.log(2 ** 2) //4 |
(完)