Суть 3 строки,если можно подробно «по символам грубо говоря»?
Читайте внимательно учебник. Судя по вопросам вы читаете learn.javascript.ru. В нем все очень подробно разбирается. Не поняли с одного раза, читайте еще раз, до тех пор пока не поймете. Вы задаете, очень глупые вопросы.function checkSpam(str) {
  var lowerStr = str.toLowerCase();

  return !!(~lowerStr.indexOf('viagra') || ~lowerStr.indexOf('xxx'));
}

console.log(checkSpam('buy ViAgRA now'));
console.log(checkSpam('free xxxxx'));
console.log(checkSpam("innocent rabbit"));~lowerStr.indexOf('viagra') // Если подстрока найдена, то вернется ее индекс начальной позиции. 
Если подстрока не найдена, то вернется -1. Для удобства делают побитовое НЕ (~).
т.е если строка будет найдена то в любом случае вернется положительное число, при побитовом НЕ, оно так станет в любом случае или строго меньше 0 или строго больше. 
А любое число отличное от 0 является true. Если строка не будет найдена, то вернется -1, при побитовом НЕ, станет 0. В логическом представлении false.
Тоже самое и с ~lowerStr.indexOf('xxx').!! - это двойное отрицание. Костыльный прием перевести что угодно в булевый тип, trueили false.|| - это побитовое ИЛИ.// В итоге при передачи строки "buy ViAgRA now":
// ~lowerStr.indexOf('viagra') = -5
// ~lowerStr.indexOf('xxx') = 0
// (~lowerStr.indexOf('viagra') || ~lowerStr.indexOf('xxx')) = -5
// !!(~lowerStr.indexOf('viagra') || ~lowerStr.indexOf('xxx')) = true
// Возвращается trueВот так возможно вам будет более ясно как работает "проверка спама":let checkSpam = string => {
	let lowerCaseString = string.toLowerCase(); // "Преобразовать" строку в строку с нижним регистром
  
  if (lowerCaseString.indexOf(`viagra`) != -1 || lowerCaseString.indexOf(`xxx`) != -1) { // Если найдена хотя бы одна из подстрок, то вернуть true
  	return true;
  } else { // иначе вернуть false
  	return false;
  }
}

console.log(checkSpam('buy ViAgRA now')); // true
console.log(checkSpam('free xxxxx')); // true
console.log(checkSpam("innocent rabbit")); // false
! ! ~ 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) будут проверяться до тех пор, пока какой-то не вернёт не-нулевое значение.