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