! ! ~ s.indexOf( substring)
– такая короткая запись означает «есть ли подстрока?»
Как это работает. Метод объекта строки
indexOf()
возвращает найденное положение подстроки в строке: число от 0 и больше; или –1, когда подстрока не найдена. На деле часто требуется из этого получить
true
или
false
– когда интересует лишь, есть подстрока или нет, а позиция её безразлична. Из –1 нам надо получить false, а из всего остального true.
Для этого используются
побитовое НЕ ~
и
логическое НЕ !
~
обладает замечательным свойством: только из –1 получается 0 (а из нуля –1):
~(-1) === 0
!
является логическим оператором и его результат – true или false. Например,
!5 === false
, а
!0 === true
.
Это почти то, что нужно, с точностью до наоборот – в случае 0 нужен false, а не-нуля true. Поэтому добавляем ещё одно логическое НЕ. Вот и получается
!!~
:
!!~5 === true;
!!~0 === true;
!!~-1 === false;
В вашем примере не один
indexOf()
, а в скобках перечислены несколько вариантов:
(~s.indexOf('AAA') || ~s.indexOf('BBB'))
.
||
– это
логическое ИЛИ. Проверяется слева направо, пока не найдётся первое выражение, которое конвертируется в true, и возвращается его значение как есть, без конвертации в true/false. Например:
( false || 5) === 5;
( 0 || 0 || 1 || 0) === 1;
( 5 || 1 || true) === 5;
( false || 0) === 0;
Значит, несколько
~s.indexOf(substr)
будут проверяться до тех пор, пока какой-то не вернёт не-нулевое значение.