发现很多库中都有用到>>>0这种写法,大致讲一下>>>0的作用和理解
首先要介绍一下数据类型
UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64
固定长度的整型,包括有符号整型或无符号整型。
整型范围
- Int8 - [-128 : 127]
- Int16 - [-32768 : 32767]
- Int32 - [-2147483648 : 2147483647]
- Int64 - [-9223372036854775808 : 9223372036854775807]
无符号整型范围
- UInt8 - [0 : 255]
- UInt16 - [0 : 65535]
- UInt32 - [0 : 4294967295]
- UInt64 - [0 : 18446744073709551615]
移位操作符在移位前做了两种转换,第一将不是
number类型的数据转换为number,第二将number转换为无符号的32bit数据,也就是Uint32类型。这些与移位的位数无关,移位0位主要就是用了js的内部特性做了前两种转换 Uint32类型是如何转换的
1 . 如果不能转换为Number,那就为0
2 . 如果为非整数,先转换为整数,参考公式sign(n) ⋅ floor(abs(n))
function ToInteger(x) {
x = Number(x);
return x < 0 ? Math.ceil(x) : Math.floor(x);
}
3 . 如果是正数,返回正数,如果是负数,返回负数 + 2的32次方
function modulo(a, b) {
return a - Math.floor(a/b)*b;
}
function ToUint32(x) {
return modulo(ToInteger(x), Math.pow(2, 32));
}
所以
0.1 >>> 0 返回 0
1.2 >>> 0 返回 1
-1 >>> 0 返回 4294967295
>> 和 >>>有什么不一样
查看MDN>>>是补零(无符号)右移,>>是带符号移位.
>>>是补零(无符号)右移:将第一个操作数向右移动指定数量的位. 右边移出位被抛弃. 左边多出的空位由0补齐.
>>带符号移位:将第一个操作数向右移动指定数量的位. 右边移出位被抛弃. 左边多出的空位由原值的最左边数字补齐.
总结
x >>> 0本质上就是保证x有意义(为数字类型),且为正整数,在有效的数组范围内(0 ~ 4294967295),且在无意义的情况下缺省值为0