JavaScript втричі більше ніж


88

Я побачив цей синтаксис в іншому дописі StackOverflow і мені було цікаво, що він робить:

var len = this.length >>> 0;

Що >>>означає?


1
Це правильний оператор зсуву, але чому б ви правильний перехід на нуль? Це якийсь дешевий спосіб зробити parseInt?
Racket Hazmat

5
>>>завжди встановлює знаковий біт на нуль, навіть якщо ви зсуваєте на нуль бітів.
John Flatness

4
Перевірте відповідь про чому вони використовують в цьому випадку >>>оператор: stackoverflow.com/questions/3081987 / ...
Christian C. Salvado

1
Потрійний кутовий кронштейн JavaScript
wprl

Я бачив цей синтаксис у developer.mozilla.org/en/docs/Web/JavaScript/Reference/… var length = list.length >>> 0; (той самий випадок використання, що і ваш)
Марс Робертсон,

Відповіді:



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()при використанні для від’ємних чисел.
Al Kepp

6
Якщо ви зробите >>> 0для від’ємного числа, це перетворює його на комплімент 2, то робить правильний зсув. Тому -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat

@AlKepp - так, я побачив помилку та виправив її - спершу повинен був перевірити, але це було явно швидке запитання :).
nrabinowitz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.