2015-07-10 97 views
5

我只是在浏览Mozilla开发者文档,发现表示我不知道用于什么,也无法通过互联网找到任何信息。“>>>”运算符 - 用于什么?

Array filter polyfill - line 10

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

任何建议,这是什么运营商是?

+0

它是[按位运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators)。 – Danny

回答

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. lval成为GetValue(lref)。
  3. rref是评估结果添加剂表达
  4. rval成为GetValue(rref)。
  5. lnum是ToUint32(lval)。
  6. rnum是ToUint32(rval)。
  7. shiftCount转换是屏蔽掉所有的结果,但RNUM的至少显著5位,也就是计算RNUM & 0x1F的。
  8. 返回执行零填充右移的结果lnumshiftCount位。空位填充零。 结果是一个无符号的32位整数。

它基本上转换两个操作数以32位无符号整数(步骤5和6)和转移的左手侧表达,右手侧表达倍。

如果我们看一下definition of ToInt32

  1. 是调用ToNumber对输入参数的结果。
  2. 如果数字是NaN,+ 0,-0,+∞或-∞,则返回+0。
  3. POSINT是符号()*地板(ABS())。
  4. int32bitPOSINT模2 ;即,有限整数值数字类型的ķ用正号和小于2 在幅度使得POSINTķ数学差是数学上的2 的整数倍。
  5. 返回int32bit

首先参数被转换为一个数字(如果它是一个不是有效的数字然后NaN将由ToNumber被返回)。第4步确保您返回的范围为0到2的有效数字。

+2

_ *向上级答案弓* 1(看来狗在这个问题上至高无上;-)) – Cerbrus

+0

现在它非常清楚!谢谢!顺便说一句,这似乎是JS忍者求职面试非常好的问题:) – kuba

+1

@kuba:我不认为有人可以期望开发人员知道这一点。但是,通过文档可访问... – Cerbrus

4

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

该运算符将第一个操作数向右移动指定的位数。向右移位的过多位被丢弃。零位从左侧移入。符号位变成0,所以结果总是非负的。

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

但是,负数不是这种情况。例如,-9 >>> 21073741821产生,这比-9 >> 2不同(其产生-3):

@thefourtheyeanswered with a good explanation关于此操作符的使用。