JavaScript в три раза больше, чем

88

Я видел этот синтаксис в другом сообщении StackOverflow, и мне было любопытно, что он делает:

var len = this.length >>> 0;

Что >>>значит?

Джей Балачандран
источник
1
Это оператор сдвига вправо, но зачем сдвиг вправо на ноль? Это какой-то дешевый способ сделать parseInt?
Rocket Hazmat
5
>>>всегда устанавливает нулевой бит знака, даже если вы выполняете сдвиг на нулевые биты.
Джон Флэтнесс
4
Проверьте этот ответ о том, почему они используют в этом случае >>>оператор: stackoverflow.com/questions/3081987/…
Кристиан С. Сальвадо
1
Тройная угловая скобка JavaScript
wprl
Я видел этот синтаксис в developer.mozilla.org/en/docs/Web/JavaScript/Reference/… var length = list.length >>> 0; (тот же вариант использования, что и ваш)
Марс Робертсон,

Ответы:

49

Это беззнаковый оператор сдвига вправо . Интересно, что это единственный побитовый оператор , который без знака в JavaScript.

Оператор >>> сдвигает биты выражения expression1 вправо на количество битов, указанное в expression2. Слева заполняются нули. Сдвинутые вправо цифры отбрасываются.

Джо
источник
107

Игнорируя его предполагаемое значение, скорее всего, вы увидите его использование:


>>> 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свойство (например, an Array) уже будет целым числом.

Я также видел несколько короче , ~~используется таким же образом: ~~9.5 == 9; // true.

Нрабинович
источник
Я сомневаюсь, что это то же самое, что и Math.abs()для отрицательных чисел.
Аль Кепп
6
Если вы сделаете >>> 0отрицательное число, оно преобразует его в комплимент 2, а затем сделает сдвиг вправо. Следовательно -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat
@AlKepp - да, я увидел ошибку и исправил ее - сначала нужно было протестировать, но это был явно быстрый вопрос :).
nrabinowitz