Как !! ~ (а не тильда / взрыва взрыва тильда) изменить результат вызова метода "содержит / включен" в массиве? - PullRequest
93 голосов
/ 16 февраля 2012

Если вы читаете комментарии на странице jQuery inArray здесь , есть интересное объявление:

!!~jQuery.inArray(elm, arr) 

Теперь, я думаю, двойной восклицательный знак преобразует результатнабрать boolean со значением true.Чего я не понимаю, так это как использовать оператор тильды (~) во всем этом?

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

Я не понимаю цели тильды здесь.Может кто-нибудь объяснить это или указать мне на ресурс?

Ответы [ 13 ]

3 голосов
/ 14 мая 2012

Я предполагаю, что он там, потому что он на несколько символов короче (какие авторы библиотеки всегда следуют). Он также использует операции, которые занимают всего несколько машинных циклов при компиляции в собственный код (в отличие от сравнения с числом.)

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

2 голосов
/ 14 мая 2012

Я предполагаю, что поскольку это побитовая операция, это самый быстрый (дешевый в вычислительном отношении) способ проверить, появляется ли путь вifiedPaths.

1 голос
/ 14 мая 2012

Как (~(-1)) === 0, так:

!!(~(-1)) === Boolean(~(-1)) === Boolean(0) === false
...