作者:唐一
背景:最近看的React源码中提到这个,就想了解下
知识储备
1、标准。JavaScript
采用的IEEE754
标准作为数字存储标准
采用
IEEE754
也是JavaScript
天生就带bug
的渊源了
2、IEEE754
规定双精度数值以64位存储,其中1位为符号位,11位为指数位,剩余52位为尾数为
不知道指数位和尾数位、符号位的自行找计算机组成原理充电
S
PPP PPPP PPPP
TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT
S:符号位
P:指数位
T:尾数位
对于无符号数值,则位11位指数位,53位尾数位
3、JavaScript
的位运算以32二进制执行
进行位运算时,先将数值转换成32位有符号整数(重点:整数),既然取整了,自然就去除了小数部分了
正文
还有什么正文呦,上面的只是储备都讲完了。。。
// 这里才是重要的
let floatNum = 10 / 3;
console.log(floatNum); // 3.3333333333333335
console.log(floatNum.toString(2)); // 转换成二进制表示的字符串
// "11.010101010101010101010101010101010101010101010101011"
let intNum = floatNum | 0;
console.log(intNum); // 3
console.log(intNum.toString(2)); // "11"
那么floatNum
和0
进行或运算后,舍弃了小数部分,二进制也由原来的妖妖点XXXX
变成了妖妖
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0000
上面的3
和下面的0
进行与运算,也即是全部保留3
的位数据,最终还是3
啦
所以主要| 0
的操作主要是看中了取整的功能,位运算的不是主要看点
Note:好高级的样子?但是我不建议你这么用
1、可读性低,没有注释别人不知道你在干嘛
2、丢失高位数据,原本52(或53)位的数据,被舍弃掉高位的21(或22位)的数据,非常危险
网友评论