Он не просто преобразует не числа в число, он конвертирует их в числа, которые могут быть выражены как 32-разрядные целые числа без знака.
Хотя числа JavaScript являются числами с плавающей запятой двойной точности (*), побитовые операторы (<<
, >>
, &
, |
и ~
) определены в терминах операций над 32-разрядными целыми числами , Выполнение побитовой операции преобразует число в 32-разрядное целое число со знаком, теряя все дроби и старшие разряды, чем 32, перед выполнением вычисления и последующим преобразованием обратно в число.
Таким образом, выполнение побитовой операции без реального эффекта, например, сдвиг вправо на 0 бит >>0
, - это быстрый способ округлить число и убедиться, что оно находится в 32-битном диапазоне int. Кроме того, тройной оператор >>>
после выполнения своей операции без знака преобразует результаты своего вычисления в число как целое число без знака, а не как целое число со знаком, как это делают другие, поэтому его можно использовать для преобразования отрицательных значений в 32-разрядные. версия с двумя дополнениями как большое число. Использование >>>0
гарантирует, что у вас есть целое число от 0 до 0xFFFFFFFF.
В этом случае это полезно, потому что ECMAScript определяет индексы Array в терминах 32-битных беззнаковых целых. Поэтому, если вы пытаетесь реализовать array.filter
таким образом, чтобы он точно дублировал то, что говорится в стандарте ECMAScript Fifth Edition, вы бы преобразовали число в 32-битное целое число без знака следующим образом.
(На самом деле в этом нет особой практической необходимости, поскольку, надеюсь, люди не будут устанавливать 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 действительно использует int, когда это возможно, по соображениям производительности. Но это будет деталь реализации, которую вы не получите воспользоваться.)