Как x|0 определяет число в JavaScript?

В принятом ответе на мой предыдущий вопрос ( Какой самый быстрый способ генерировать случайное целое число в javascript?) Мне было интересно, как число теряет свои десятичные дроби через символ |,

Например:

var x = 5.12042;
x = x|0;

Как этот этаж число 5?

Еще несколько примеров:

console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 );   // 9

3 ответа

Решение

Потому что, согласно спецификациям ECMAScript, операторы побитового вызова ToInt32 на каждое выражение для оценки.

Смотрите 11.10 Бинарные побитовые операторы:

Производство A : A @B, где @ является одним из побитовых операторов в вышеприведенных произведениях, оценивается следующим образом:

  1. оценивать A,

  2. Вызов GetValue(Result(1)),

  3. оценивать B,

  4. Вызов GetValue(Result(3)),

  5. ВызовToInt32(Result(2)).

  6. ВызовToInt32(Result(4)).

  7. Применить побитовый оператор @ в Result(5) а также Result(6), Результатом является 32-разрядное целое число со знаком.

  8. Вернуть Result(7),

Побитовые операторы преобразуют свои аргументы в целые числа (см. http://es5.github.com/). Большинство языков, которые я знаю, не поддерживают этот тип конверсии:

    $ python -c "1.0 | 0"
    Traceback (последний вызов был последним):
      Файл "", строка 1, в 
    Ошибка типа: неподдерживаемые типы операндов для |: 'float' и 'int'

    $ ruby ​​-e '1.0 | 0'
    -e:1:in `': неопределенный метод`|' для 1.0:Float (NoMethodError)

    $ echo "int main(){1.0|0;}" | gcc -xc -: В функции 'main':: 1: ошибка: недопустимые операнды в двоичном | (есть 'double' и 'int')

При выполнении floorхотя можно было бы преобразовать аргумент в целое число, это не то, что делает большинство языков, потому что исходный тип является числом с плавающей запятой.

Лучший способ сделать это при сохранении типа данных - перейти на exponent цифры в mantissa и обнулить оставшиеся биты.

Если вам интересно, вы можете взглянуть на спецификацию IEEE для чисел с плавающей запятой.

Другие вопросы по тегам