Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:
object o = null;
DateTime d = (DateTime)o;
Он выкинет NullReferenceException
в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.
Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:
" />
Здесь SelectedDate
на самом деле является свойством - типа DateTime
- типа Calendar
Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException
, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...
Как это работает? Наша теория заключалась в том, что использование такого оператора приводит число к целому числу, таким образом удаляя дробную часть
blockquote>. Все побитовые операции, кроме сдвига без знака,
>>>
, работают с подписанными 32-битными целыми числами , Таким образом, использование побитовых операций преобразует float в целое число.Имеет ли он какие-либо преимущества перед выполнением Math.floor? Может, это немного быстрее? (каламбур не предназначен)
blockquote>http://jsperf.com/or-vs-floor/2 выглядит немного быстрее
Есть ли у него какие-то недостатки? Может быть, в некоторых случаях это не работает? Ясность очевидна, так как мы должны были понять это, и хорошо, я задаю этот вопрос.
blockquote>
- Не пройдет jsLint.
- Только 32-битные знаковые целые числа
- Нечетное сравнительное поведение:
Math.floor(NaN) === NaN
, а(NaN | 0) === 0
Это усечение в отличие от напольного покрытия. Ответ Говарда выглядит правильно; Но я бы добавил, что Math.floor
делает именно то, что он предположительно относится к отрицательным числам. Математически это то, что слово.
В случае, описанном выше, программисту больше интересовало усечение или полное отключение десятичной дроби. Хотя синтаксис, который они использовали, скрывает то, что они преобразуют float в int.
Ваша первая точка верна. Число преобразуется в целое число, и поэтому любые десятичные разряды удаляются. Обратите внимание, что Math.floor
округляет до следующего целого числа до минус бесконечности и, таким образом, дает другой результат при применении к отрицательным числам.
В ECMAScript 6 эквивалент |0
равен Math.trunc , я должен сказать:
Возвращает неотъемлемую часть числа, удаляя любые дробные цифры. Это просто усекает точку и цифры за ней, независимо от того, является ли аргумент положительным числом или отрицательным числом.
blockquote>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