2012-06-05 3 views
3

Недавно я обнаружил некоторые другие способы удаления дробной части числовых значений в JavaScript, отличном от Math.floor(n), в частности, двоичного оператора NOT ~~n и выполнения поразрядного или с 0 n|0.Номера настилов в JavaScript: ~~ n, n | 0 или Math.floor (n)?

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

+0

http://stackoverflow.com/questions/2526682/why-is-javascripts-math-floor-the-slowest-way-to-calculate-floor-in-javascript, http://stackoverflow.com/questions/9049677/how-do-x0-floor-the-number-in-javascript –

+0

В конечном итоге не будет никакой разницы, поскольку браузеры будут развиваться, см. Согласованную производительность хрома http://jsperf.com/math-floor-vs- math-round-vs-parseint/41, лучше писать код поддерживаемого кода – ajax333221

+1

@ ajax333221 Мне просто нравится, как выглядит IE-запись, поскольку она отсутствует данные ;-) –

ответ

6

Будьте понятны следующему человеку, который смотрит на ваш код и использует Math.floor().

The performance gain of 1%-40% на самом деле не стоит того, чтобы ваш код не был запутан и неспособен поддерживать.

+3

(Поэтому им не нужно спрашивать «Что делает n | 0 означает? "на SO ...) –

+1

@pst, вы, вероятно, означали _repost_ вместо _ask_ – ajax333221

+0

@ josh3736 неправильный тест .... некоторые двигатели кэширует математику * результаты ... – 4esn0k

2

(я полностью согласен с Джоша ответ:. За ясный ремонтопригодны код)

Вот объяснение на других побитовое подходов:

Бит-накрест операторы работают, потому что они только оператора на 32-битных (подписанных) целых числах, но числа в JavaScript - все значения IEEE-754. Таким образом, существует внутреннее преобразование (усечение, а не пол!), Которое происходит с операндами для бит-мудирующих операторов.

Применяемая побитовое операции (например, n<<0, ~~n или n|0), то действует как функция идентичности которой «ничего не делает» для преобразованных значений: то есть, все эти подходы опираются на той же конверсии применительно к бит-мудрых операндов.

Попробуйте n в виде отрицательного числа или значения за пределами [-2 , 2 -1]:

(-1.23|0)   // -1 
Math.floor(-1.23) // -2 

var x = Math.pow(2, 40) + .5 
x|0     // 0 
Math.floor(x)  // 1099511627776 

Дня кодирование.

5

Операнды всех битовых операторов преобразуются в подписанных 32-разрядных целых чисел:

Math.floor(2147483648) // 2147483648 
2147483648 | 0   // 2147483648 
~~2147483648   // 2147483648 

Math.floor(2147483649) // 2147483649 
2147483649 | 0   // -2147483647 
~~2147483649   // -2147483647 

Так используйте Math.Floor();

Смежные вопросы