Как понимать двойное отрицание: !! (например, в JavaScript)?
Ответы
Ответ 1
В javascript всякое значение может быть интерпретировано как Boolean. (Правила этой интерпретации довольно сложны и не вполне интуитивны.)
Если вы укажете какое-нибудь выражение там, где ожидается Boolean (например, внутр
if'а), оно проинтерпретируется как Boolean, и всё. Но если вы хотите получить соответствующий Boolean (например, чтобы вернуть его из функции или присвоить другой переменной), вам нужен трюк, который заставит систему проинтерпретировать ваше выражение в булевом контексте.
Для этой цели традиционно используется двойное отрицание: первое отрицание "требует
булев контекст, так что выражение интерпретируется как Boolean, а второе отрицание "отменяет" первое.
Из документации:
Оператор отрицания: возвращает false если его аргумент может быть преобразован
true, в противном случае возвращает true.
Для справки: значения, которые в булевом контексте будут проинтерпретированы ка
false суть следующие:
число 0.0
число NaN
undefined
null
пустая строка
ну и конечно false
Все остальные значения будут проинтерпретированы как true.
Пример: если x -- объект или null, вместо
if (x != null)
return true;
else
return false;
можно воспользоваться изящным
return !!x;
По поводу других языков: подобный трюк нужен в основном в слабо типизированных языка
вроде javascript'а, в котором значением переменной может быть и true/false, и undefined
и функция, и объект. Применение двойного отрицания гарантирует отсутствие неожиданностей в поведении полученного объекта: его тип то уж точно boolean. Однако, я встречал этот трюк и в C++ в контексте явного преобразования указателя в bool.
Комментариев нет:
Отправить комментарий