Еще один, более простой, человеческий способ «читать», а не нет:
Первый '!' выполняет 2 действия: «конвертирует» значение в логическое значение, а затем выводит противоположное. Таким образом, оно будет иметь значение true, если значение является ложным.
Второе '!' просто вывести противоположность первого.
Таким образом, в основном, входное значение может быть любым, может быть строкой, но вы хотите логический вывод, поэтому используйте первый '!'. На этом этапе, если вы хотите, чтобы TRUE, когда входное значение было «ложно», остановитесь здесь и просто используйте один «!»; в противном случае, если вы хотите значение ИСТИНА, когда входное значение равно «истина», добавьте еще один «!».