JavaScript: | оператор в операторе return [duplicate]

Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:

object o = null;
DateTime d = (DateTime)o;

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

Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:

" />

Здесь SelectedDate на самом деле является свойством - типа DateTime - типа Calendar Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...

155
задан Alex Turpin 20 September 2011 в 16:59
поделиться

5 ответов

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

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

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

http://jsperf.com/or-vs-floor/2 выглядит немного быстрее

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

  • Не пройдет jsLint.
  • Только 32-битные знаковые целые числа
  • Нечетное сравнительное поведение: Math.floor(NaN) === NaN, а (NaN | 0) === 0
115
ответ дан Joe 28 August 2018 в 01:21
поделиться

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

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

24
ответ дан Chad La Guardia 28 August 2018 в 01:21
поделиться

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

10
ответ дан Howard 28 August 2018 в 01:21
поделиться
  • Спецификации говорят, что он преобразуется в целое число: пусть lnum будет ToInt32 (lval).
  • Производительность: это было проверено ранее на jsperf .
5
ответ дан pimvdb 28 August 2018 в 01:21
поделиться

В 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
ответ дан zangw 28 August 2018 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: