">>>" 运算符 - 用于什么?

5

我刚刚查看了Mozilla开发者文档,发现了一种我不知道用途的符号,并且在互联网上也找不到任何信息。

数组过滤器polyfill - 第10行

var t = Object(this);
var len = t.length >>> 0;

有什么建议这个运算符是用来做什么的?

它是一个位运算符 - Danny
2个回答

4

简而言之:

t.length >>> 0;

实际上,它尝试从t.length获取一个有效的32位无符号整数。就我们所知,t.length可以是任何类型(对象、数组、字符串等)。如果已经是有效的32位无符号数字,则>>> 0返回值不变。例如:

console.log({} >>> 0);
// 0
console.log([] >>> 0);
// 0
console.log("Google" >>> 0);
// 0

通常情况下,这种位运算技巧被用于避免像这样的if块类型检查:if
var len = 0;
if (typeof data === 'number') {
    len = data;
}

如果len是浮点数值,我们可能仍需要将其转换为整数。 解释 >>>被称为零填充右移运算符。除了用作位运算符外,它还用于从对象中获取32位数值。 ECMA Script 5.1规范中的>>>指出:
  1. 计算ShiftExpression的结果并将其赋给lref。
  2. 计算GetValue(lref)并将其赋给lval。
  3. 计算AdditiveExpression的结果并将其赋给rref。
  4. 计算GetValue(rref)并将其赋给rval。
  5. 计算ToUint32(lval)并将其赋给lnum。
  6. 计算ToUint32(rval)并将其赋给rnum。
  7. 将rnum的所有位都掩码,只保留最低有效的5位,即计算rnum&0x1F。
  8. 通过将lnum向右移动shiftCount位来执行零填充右移操作。空出的位用零填充。结果是一个无符号的32位整数。
它基本上将两个操作数转换为32位无符号整数(步骤5和6),并将左侧表达式向右移动右侧表达式次数。
如果我们查看ToInt32定义
  1. 将输入参数传递给 ToNumber 函数后,将结果赋值给 number
  2. 如果 number 是 NaN、+0、-0、+∞ 或 -∞,则返回 +0。
  3. 将 abs(number) 向下取整后乘上 sign(number),将结果赋值给 posInt
  4. posInt 对 232 取模,即在满足数学差为 232 的倍数的前提下,找到一个 Number 类型的有正符号且绝对值小于 232 的整数值 k,使得 posIntk 的差正好为 mathematically an integer multiple of 232,将该整数值赋值给 int32bit
  5. 返回 int32bit

首先,将参数转换为数字(如果不是有效数字则 ToNumber 将返回 NaN)。第四步确保您返回在 0 到 232 范围内的有效数字。


2
向更优秀的回答者致敬 +1(看来在这个问题上狗狗占据了统治地位;-)) - Cerbrus
现在非常清楚了!谢谢!顺便说一句,这似乎是JS忍者工作面试的非常好的问题 :) - kuba
1
@kuba:我认为不能期望开发人员知道这个。然而,有了可访问的文档... - Cerbrus

4

这是一个"零填充右移"(按位)运算符。

该运算符将第一个操作数向右移动指定的位数。向右移动的多余位被丢弃。从左侧移入零位。符号位变为0,因此结果始终为非负数。

对于非负数,零填充右移和符号传播右移产生相同的结果。例如,9 >>> 2的结果为2,与9 >> 2相同:

但是,对于负数,情况并非如此。例如,-9 >>> 2的结果为1073741821,与-9 >> 2不同(其结果为-3):

@thefourtheye 回答了这个操作符的使用方法,给出了很好的解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接