Двойное отрицание

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