JavaScript大于三倍


88

我在另一个StackOverflow帖子上看到了这种语法,并对它的作用感到好奇:

var len = this.length >>> 0;

>>>意味着什么?


1
那是一个右移运算符,但是为什么要右移零呢?这是一种便宜的方法parseInt吗?
火箭Hazmat

5
>>>即使您将位移位零,也始终将符号位设置为零。
John Flatness

4
检查这个答案关于为什么他们在这种情况下使用的>>>运营商:stackoverflow.com/questions/3081987/...
基督教C. SALVADO

1
JavaScript三重尖括号
wprl

我在developer.mozilla.org/en/docs/Web/JavaScript/Reference/…中 看到了这种语法var length = list.length >>> 0; (与您的用例相同)
Mars Robertson

Answers:


49

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

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


106

忽略其预期的含义,很可能会在其中看到它的使用位置:


>>> 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可用于将任何变量转换为有符号整数。


你能解释一下如何迭代使用>>>吗?

1
@ K48我不认为他的意思是迭代,我认为他的意思是说这迫使长度变成数字。(否则,我同样感到困惑。)但是这里是一个伟大的答案是阐明更多: stackoverflow.com/questions/1822350/...
迈克·威廉姆森

8

该运算符是合乎逻辑的右移。在此,数字移位0位。数学上将零位移位应该无效。

但是这里用于将值转换为无符号的32位整数。


3

>>>是按位运算符,零填充右移

我认为>>> 0对正数的唯一作用是向下舍入到最接近的整数,与相同Math.floor()。我不明白为什么在您的示例中这是必需的,因为通常.length属性(例如的属性Array)已经是整数。

我还看到了~~以相同方式使用的稍短一些:~~9.5 == 9; // true


我怀疑它是否与Math.abs()负数相同。
Al Kepp 2011年

6
如果>>> 0对负数进行运算,则会将其转换为2的补数,然后进行右移。因此-14 >>> 0 == 1073741820。(msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx
火箭的Hazmat

@AlKepp-是的,我看到了错误并修复了它-应该首先进行测试,但这显然是一个快速绘制的问题:)。
nrabinowitz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.