Number

JavaScript 至今没有真正的整数,我们用的Number事实上是双精度浮点数,详见JavaScript 关于 IEEE 754 双精度浮点数的实现

精度

parseInt(0.0000008) === 8

parseInt 的第一个类型是字符串,所以会将传入的参数转换成字符串,但是小于0.0000001(1e-7)的数字转换成 String 时,会变成科学记号法,也就是String(0.0000008)的结果为8e-7parseInt并没有将e视为一个数字,所以在转换到 8 后就停止了,最终 parseInt(0.0000008) === 8

Referrence: http://justjavac.com/javascript/2015/01/08/why-parseint-0-00000008-euqal-8-in-js.htmlopen in new window

0.1 + 0.2 = 0.3

因为浮点数运算的精度问题导致0.1 + 0.2 = 0.3这个等式不成立。正确的比较方法是使用 JavaScript 提供的最小精度值:

console.log(Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
1

检查等式左右两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法。

关于 3.toString()

JavaScript 规范中规定的数字直接量可以支持四种写法:十进制数、二进制整数、八进制整数和十六进制整数。

十进制的 Number 可以带小数,小数点前后部分都可以省略,但是不能同时省略。

.01
12.
12.01
1
2
3

以上三种表示都是合法的数字字面量。因此,3.toString()里的3.会当作省略了小数点后面部分的数字,而单独看成一个整体。

所以3.toString()等同于(3.)toString(),这显然是语法有问题。

3..toString()会被计算成(3.).toString(),OK!

3...toString()等同于(3.)..toString(),语法问题。

我们要想让点单独成为一个(词法分析里的)token,就要加入空格。

3 .toString() // 等效于 (3).toString()
1