js中表达式 >>> 0

346 阅读2分钟

发现很多库中都有用到>>>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