@vladvlad09

Суть 3 строки,если можно подробно «по символам грубо говоря»?

function checkSpam(str) {
var lowerStr = str.toLowerCase();
return !!(~lowerStr.indexOf('viagra') || ~lowerStr.indexOf('xxx'));
}

alert( checkSpam('buy ViAgRA now') );
alert( checkSpam('free xxxxx') );
alert( checkSpam("innocent rabbit") );
  • Вопрос задан
  • 284 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
! ! ~ 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) будут проверяться до тех пор, пока какой-то не вернёт не-нулевое значение.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
evgeniy8705
@evgeniy8705
Повелитель вселенной
Читайте внимательно учебник. Судя по вопросам вы читаете 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
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы