Страницы

Поиск по вопросам

понедельник, 17 декабря 2018 г.

JavaScript Двойное отрицание(!!) и побитовый оператор Тильда (~)

Изучаю JavaScript. Задачка из учебника: Напишите функцию checkSpam(str), которая возвращает true, если строка str содержит „html“ или „css“, а иначе false. Функция должна быть нечувствительна к регистру:
Ответ из учебника:
function checkSpam(str) { var lowerStr = str.toLowerCase(); return !!(~lowerStr.indexOf('html') || ~lowerStr.indexOf('css')); } alert( checkSpam('hTml now') ); alert( checkSpam('free cSs') ); alert( checkSpam("more java") );
Вопросы:
Меня путает наличие сразу !! и ~ Как читается строка return? "Если не найдено, то вернуть ..." первый знак ! = Не, и приводим к логическому типу; дальше непонятки из-за ~ и второго отрицания. Вот мой вариант, он мне кажется понятнее:
function checkSpam(str) { var lowerStr = str.toLowerCase(); return (lowerStr.indexOf('html') != -1 || lowerStr.indexOf('css') != -1); } alert( checkSpam('hTml now') ); alert( checkSpam('free cSs') ); alert( checkSpam("more java") );
Есть ли в данных вариантах разница и какой вид более предпочтительный?


Ответ

Знак ! обозначает не
Если вы напишите return (~lowerStr.indexOf('html') || ~lowerStr.indexOf('css')), то оно просто выведет положение слов. Если вы введёте return !(~lowerStr.indexOf('html') || ~lowerStr.indexOf('css')), но оно выведет true/false, при том, что false выведется, если слово было найдено А когда вы вводите два !!, то оно выведет true, там где было false и наоборот
Знак ~ возвращает значение -(число + 1) Т.е. в вашем случае, если положение равно -1, то она выводит 0 и при этом в условии выводится false, а если другое любое число, то это true

Комментариев нет:

Отправить комментарий