2014-01-16 2 views
5

Увидели '~ ~' кто-нибудь может объяснить, для чего он используется?Что такое '~ ~' в Javascript?

Прошли поисковые запросы Google, и для этого ничего не возвращается.

Это какой-то математический оператор, но не знает, что он на самом деле делает с числовыми значениями?

+0

Если это дубликат, то, что я могу сделать, чтобы сделать q & a? –

+0

Не уверен, где это дубликат. Я не вижу никаких предыдущих вопросов. Ссылка? –

+0

Я вижу его как отмеченный как дубликат с http://stackoverflow.com/questions/4055633/what-does-do-in-javascript –

ответ

7

~ является оператором побитовое. Используя его в два раза, некоторые люди говорят, что его оптимизация вместо использования Math.floor как:

var a = 1.9;
Math.floor(a) === ~~a // true (1 === 1)

Однако 1) Read this answer, чтобы понять, как это достигается, и this performance test видеть, что в некоторых случаев Math.floor() быстрее. Имеет смысл, что Math.floor() превзойдет позже, потому что это его цель!

Однако 2) Прочтите this answer, чтобы увидеть различные эффекты на отрицательные числа и некоторые кромки.

var a = -1.5;
Math.floor(a) !== ~~a // true (-2 !== -1)

Однако +)
Math.floor(Infinity) !== ~~Infinity // true (Infinity !== 0)

Однако ++)
Проверьте комментарии, а также, я уверен, что там будут какие-то более интересные аспекты.

Лично я предпочитаю читаемость в таком случае, когда производительность даже не верная. Плюс другие эффекты ... просто используйте Math.floor это к лучшему!

См. Для более побитовых операторов: mozzila ref и как номера представлены в JavaScript на w3schools.

+1

Не совсем то же, что и 'Math.floor()', поскольку побитовые операторы JavaScript все работа с 32-битными значениями. «Math.floor» может иметь дело с 64-битными значениями с плавающей запятой. – Pointy

+1

Кроме того, '~~" a "возвращает 0, а' Math.floor ("a") '- NaN. – OnlyThenDidIReckonMyCurse

3

Это пара побитовых операторов дополнения. Это не один оператор.

Это иногда используется, чтобы заставить числовое значение, чтобы быть 32-битовое целое число:

var anInteger = ~ ~ aValue;