我只是浏览Mozilla开发人员文档,发现我不知道用于什么的符号,也无法通过互联网找到任何信息。
Array filter polyfill - line 10
var t = Object(this);
var len = t.length >>> 0;
有关此运营商的建议吗?
答案 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 >>>
表示
- 让 lref 成为评估 ShiftExpression 的结果。
- 让 lval 为GetValue( lref )。
- 让 rref 成为评估 AdditiveExpression 的结果。
- 让 rval 为GetValue( rref )。
- 让 lnum 为ToUint32( lval )。
- 让 rnum 为ToUint32( rval )。
- 让 shiftCount 成为屏蔽除 rnum 之外的所有但最不重要的5位的结果,即计算 rnum &amp;为0x1F。
- 返回 shiftCount 位执行 lnum 的零填充右移的结果。空位用零填充。 结果是无符号的32位整数。
醇>
它基本上将两个操作数转换为32位无符号整数(步骤5和6)并移动左侧表达式,右侧表达式时间。
如果我们查看definition of ToInt32
,
- 让 number 成为在输入参数上调用ToNumber的结果。
- 如果数字是NaN,+ 0,-0,+∞或-∞,则返回+0。
- 让 posInt 成为签名(数字)* floor(绝对(数字))。
- 让 int32bit posInt modulo 2 32 ;也就是说,数字类型的有限整数值 k 具有正号并且在数量上小于2 32 ,使得 posInt 的数学差异和 k 在数学上是2 32 的整数倍。
- 返回 int32bit 。
醇>
首先将参数转换为数字(如果它不是有效数字,则NaN
将返回ToNumber
)。第4步确保返回0到2 32 范围内的有效数字。