Якщо ви читаєте коментарі в JQuery inArray
сторінці тут , є цікава заява:
!!~jQuery.inArray(elm, arr)
Тепер я вважаю, що подвійний знак оклику перетворить результат на тип boolean
зі значенням true
. Що я не розумію, так це те, що в усьому цьому використовується ~
оператор tilde ( )?
var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
Рефакторинг if
твердження:
if (!!~jQuery.inArray("one", arr)) { alert("Found"); }
Зламатися:
jQuery.inArray("one", arr) // 0
~jQuery.inArray("one", arr) // -1 (why?)
!~jQuery.inArray("one", arr) // false
!!~jQuery.inArray("one", arr) // true
Також я помітив, що якщо поставити тильду попереду, результат буде -2
.
~!!~jQuery.inArray("one", arr) // -2
Я не розумію мети тут тильди. Хтось може пояснити це чи вказати мені на ресурс?
~jQuery.inArray()
насправді є дуже корисним - можливо, навіть дуже вагомою причиною того, чому функції пошуку повертаються -1
до відмови (єдине значення, доповненням двох яких є хибність). Після того, як ви побачили і зрозуміли фокус, я відчуваю, що він навіть читабельніший != -1
.
!!~
за що .
if (x != -1)
і if (~x)
для мене полягає в тому, що перший фактично виражає те, що ви маєте намір зробити. Останній виражає, що ви хочете зробити щось інше цілком ("будь-ласка, перетворіть мій 64-розрядний номер у 32-розрядне ціле число та перевірте, чи побітове НЕ це ціле число є істинним"), де ви просто отримаєте бажаний результат у цьому один випадок.