JavaScript三个大于号的含义是什么?

99

我在另一个StackOverflow帖子上看到了这个语法,想知道它的作用:

var len = this.length >>> 0;

>>>表示什么?


1
这是一个右移运算符,但为什么要进行零位右移呢?这是一种廉价的执行 parseInt 的方式吗? - gen_Eric
5
"">>>"无论您将其移位多少位,它始终将符号位设置为零。" - John Flatness
4
查看关于为什么在这种情况下使用 >>> 运算符的答案:http://stackoverflow.com/questions/3081987/what-good-does-zero-fill-bit-shifting-by-0-do-a-0/3082073#3082073 - Christian C. Salvadó
1
JavaScript三角括号 - wprl
我在 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find 中看到了这个语法:var length = list.length >>> 0;(与您的用例相同) - Mars Robertson
4个回答

117

忽略其本意,最有可能看到它使用的地方是:


>>> 0 是唯一一个可以将任何类型转换为正整数的运算符:

"string"         >>> 0 == 0
(function() { }) >>> 0 == 0
[1, 2, 3]        >>> 0 == 0
Math.PI          >>> 0 == 3
在你的例子中,var len = this.length >>> 0,这是一种获取整数长度以用于迭代this的方法,无论this.length可能是什么类型。
类似地,~~x可以用来将任何变量转换为有符号整数。

你能解释一下如何使用 >>> 进行迭代吗? - user6269864
1
@K48 我认为他的意思不是迭代,而是要将长度强制转换为数字。(否则,我也同样困惑。) 但这里有一个很好的答案,更详细地阐述了:https://dev59.com/MXI-5IYBdhLWcg3wf4hD - Mike Williamson

59

这是一个无符号右移位运算符。有趣的是,它是JavaScript中唯一无符号位运算符

>>运算符将expression1的位数向右移expression2指定的位数。从左侧填充零。移出右侧的数字将被丢弃。


10
那个操作符是逻辑右移,这里的数字被移动了0位。数学上来说,移动零位不应该有影响。
但是在这里,它被用来将值转换为无符号32位整数。

3
>>>是一个位运算符,它执行的是零填充右移操作。
我认为在正数上使用>>> 0的唯一效果是向下取整到最接近的整数,与Math.floor()相同。我不明白为什么在您的示例中需要这样做,因为通常一个.length属性(例如一个Array)已经是一个整数了。
我还看到过稍微简短一点的~~以同样的方式使用:~~9.5 == 9; // true

当使用负数时,我怀疑它与Math.abs()不同。 - Al Kepp
6
如果你对一个负数执行 >>> 0 操作,它会被转换为二进制补码后再进行右移操作。因此,-14 >>> 0 的结果是 1073741820。(来源:http://msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx) - gen_Eric
@AlKepp - 是的,我看到了错误并将其修复了 - 应该先测试一下,但这显然是一个快速绘画问题 :)。 - nrabinowitz

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