">>>"运营商 - 用于什么?

时间:2015-07-10 13:20:51

标签: javascript operators

我只是浏览Mozilla开发人员文档,发现我不知道用于什么的符号,也无法通过互联网找到任何信息。

Array filter polyfill - line 10

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

有关此运营商的建议吗?

2 个答案:

答案 0 :(得分:4)

这是"Zero-fill right shift"(按位)运算符。

  

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

     

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

     

然而,负数不是这种情况。例如,-9 >>> 2会产生1073741821,这与-9 >> 2不同(产生-3):

@thefourtheye answered with a good explanation关于此运算符的使用情况。

答案 1 :(得分:4)

<强> TL; DR

t.length >>> 0;

实际上尝试从t.length获取有效的32位无符号整数。根据我们所知,t.length可以是任何类型(对象,数组,字符串等)。如果值已经是有效的32位无符号数,则>>> 0将返回未更改的值。例如,

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

通常,这种按位技巧用于避免if块类型检查,如下所示

var len = 0;
if (typeof data === 'number') {
    len = data;
}

如果它是浮点值,我们可能仍需要将len转换为整数。

<强>解释

>>>被称为零填充右移运算符。除了用作按位运算符之外,它还用于从对象中获取32位数值。 ECMA Script 5.1 Specification for >>>表示

  
      
  1. lref 成为评估 ShiftExpression 的结果。
  2.   
  3. lval 为GetValue( lref )。
  4.   
  5. rref 成为评估 AdditiveExpression 的结果。
  6.   
  7. rval 为GetValue( rref )。
  8.   
  9. lnum 为ToUint32( lval )。
  10.   
  11. rnum 为ToUint32( rval )。
  12.   
  13. shiftCount 成为屏蔽除 rnum 之外的所有但最不重要的5位的结果,即计算 rnum &amp;为0x1F。
  14.   
  15. 返回 shiftCount 位执行 lnum 的零填充右移的结果。空位用零填充。 结果是无符号的32位整数。
  16.   

它基本上将两个操作数转换为32位无符号整数(步骤5和6)并移动左侧表达式,右侧表达式时间。

如果我们查看definition of ToInt32

  
      
  1. number 成为在输入参数上调用ToNumber的结果。
  2.   
  3. 如果数字是NaN,+ 0,-0,+∞或-∞,则返回+0。
  4.   
  5. posInt 成为签名(数字)* floor(绝对(数字))。
  6.   
  7. int32bit posInt modulo 2 32 ;也就是说,数字类型的有限整数值 k 具有正号并且在数量上小于2 32 ,使得 posInt 的数学差异和 k 在数学上是2 32 的整数倍。
  8.   
  9. 返回 int32bit
  10.   

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