Как понимать двойное отрицание: !! (например, в JavaScript)?
Ответ В 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.