1.为什么 0.1 + 0.2 != 0.3?
因为 JS 采用 IEEE 754 双精度版本(64位),并且只要采用 IEEE 754 的语言都有该问题。
我们都知道计算机是通过二进制来存储东西的,那么 0.1 在二进制中会表示为
// (0011) 表示循环
0.1 = 2^-4 * 1.10011(0011)
我们可以发现,0.1 在二进制中是无限循环的一些数字,其实不只是 0.1,其实很多十进制小数用二进制表示都是无限循环的。 这样其实没什么问题,但是 JS 采用的浮点数标准却会裁剪掉我们的数字。
EPSILON 属性的值接近于 2.2204460492503130808472633361816E-16,或者 2-52。
2.这个输出什么?
首先需要考虑的是优先级.
的优先级高于=
,所以先执行a.x
堆内存中的{n: 1}
就会变成{n: 1, x: undefined}
改变之后相应的b.x
也变化了,因为指向的是同一个对象。
赋值操作是从右到左,所以先执行a={n:2}
,a的引用就被改变了,然后这个返回值又赋值给了a.x
,需要注意的是这时候a.x
是第一步中的{n: 1, x: undefined}
那个对象,其实就是b.x
,相当于b.x={n:2}