Использование побитового ИЛИ 0 для заполнения номера

Мой коллега наткнулся на метод для поплавки чисел с использованием поразрядного или:

var a = 13.6 | 0; //a == 13

Мы говорили об этом и задавались вопросом несколько вещей.

  • Как это работает? Наша теория заключалась в том, что использование такого оператора приводит число к целому числу, таким образом удаляя дробную часть
  • Есть ли у него какие-либо преимущества перед выполнением Math.floor? Может быть, это немного быстрее? (каламбур не предназначен)
  • Есть ли у него какие-то недостатки? Может быть, в некоторых случаях это не работает? Ясность очевидна, так как мы должны были понять это, и хорошо, я задаю этот вопрос.

Спасибо.

4b9b3361

Как это работает? Наша теория заключалась в том, что использование такого оператора бросает число до целого числа, таким образом удаляя дробную часть

Все побитовые операции, кроме сдвига без знака, >>>, работают с подписанными 32-битными целыми числами. Таким образом, использование побитовых операций преобразует float в целое число.

Есть ли у него какие-либо преимущества перед выполнением Math.floor? Может быть, это немного Быстрее? (каламбур не предназначен)

http://jsperf.com/or-vs-floor/2 кажется немного быстрее

Есть ли у него какие-то недостатки? Может быть, в некоторых случаях это не работает? Ясность очевидна, поскольку нам нужно было понять это, и, Я задаю этот вопрос.

  • Не будет проходить jsLint.
  • Только 32-разрядные целые числа со знаком
  • Нечетное Сравнительное поведение: Math.floor(NaN) === NaN, а (NaN | 0) === 0
115
ответ дан 20 сент. '11 в 18:54
источник

Это усечение в отличие от напольного покрытия. Ответ Говарда выглядит правильно; Но я бы добавил, что Math.floor делает именно то, что он предположительно относится к отрицательным числам. Математически это то, что слово.

В случае, описанном выше, программисту больше интересовало усечение или измельчение десятичной дроби. Хотя синтаксис, который они использовали, скрывает тот факт, что они преобразуют float в int.

24
ответ дан 20 сент. '11 в 18:54
источник

В ECMAScript 6 эквивалент |0 равен Math.trunc, я должен сказать:

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

Math.trunc(13.37)   // 13
Math.trunc(42.84)   // 42
Math.trunc(0.123)   //  0
Math.trunc(-0.123)  // -0
Math.trunc("-1.123")// -1
Math.trunc(NaN)     // NaN
Math.trunc("foo")   // NaN
Math.trunc()        // NaN
13
ответ дан 10 янв. '16 в 16:44
источник

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

10
ответ дан 20 сент. '11 в 18:51
источник
  • specs говорят, что он преобразуется в целое число:

    Пусть lnum - ToInt32 (lval).

  • Производительность: это было проверено ранее на jsperf.

5
ответ дан 20 сент. '11 в 18:55
источник