Він не просто конвертує нечислові числа, а перетворює їх у числа, які можуть бути виражені як 32-бітні неподписані вставки.
Хоча Числа JavaScript є подвійний точності поплавці (*), оператори бітові ( <<
, >>
, &
, |
і ~
) визначені в термінах операцій на 32-розрядних цілих чисел. Виконуючи побітну операцію, перетворять число в 32-розрядний підписаний int, втрачаючи будь-які дроби і біти вищого місця, ніж 32, перед тим як робити обчислення, а потім перетворювати назад в число.
Таким чином, операція побітових операцій без фактичного ефекту, як, наприклад, зсув праворуч на 0 біт >>0
, - це швидкий спосіб округлити число і переконатися, що він знаходиться в діапазоні 32-бітових інт. Крім того, потрійний >>>
оператор, виконуючи свою непідписану операцію, перетворює результати свого обчислення в Число як непідписане ціле число, а не підписане ціле число, яке роблять інші, тож його можна використовувати для перетворення негативів у 32-розрядне-два доповнення версія як велика кількість. Використання >>>0
гарантує, що у вас є ціле число між 0 і 0xFFFFFFFF.
У цьому випадку це корисно, оскільки ECMAScript визначає індекси масиву в термінах 32-бітових неподписаних ints. Отже, якщо ви намагаєтесь реалізувати array.filter
таким чином, що точно дублює те, що говорить стандарт ECMAScript Fifth Edition, ви додасте число до 32-бітного неподписаного int, як це.
(Насправді існує мало практична потреба в цьому , як ми сподіваємося , що люди не будуть установки array.length
на 0.5
, -1
, 1e21
або 'LEMONS'
. Але це автори JavaScript ми говоримо про, так що ви ніколи не знаєте ...)
Підсумок:
1>>>0 === 1
-1>>>0 === 0xFFFFFFFF -1>>0 === -1
1.7>>>0 === 1
0x100000002>>>0 === 2
1e21>>>0 === 0xDEA00000 1e21>>0 === -0x21600000
Infinity>>>0 === 0
NaN>>>0 === 0
null>>>0 === 0
'1'>>>0 === 1
'x'>>>0 === 0
Object>>>0 === 0
(*: ну, вони визначаються як поводяться як плавучі. Мене не здивувало б, якщо якийсь механізм JavaScript насправді використовував ints, коли це можливо, з міркувань продуктивності. Але це буде детальною інформацією про реалізацію, яку ви не отримаєте. перевага.)