На этот вопрос был дан довольно подробный ответ, но я хотел бы добавить ответ, который, я надеюсь, максимально упрощен, что придает смысл !! настолько просто понять, насколько это возможно.
Поскольку javascript имеет так называемые значения "истинность" и "ложь", существуют выражения, которые при оценке в других выражениях приведут к условию истина или ложь, даже если проверяемое значение или выражение на самом деле не true
или false
.
Например:
if (document.getElementById('myElement')) {
// code block
}
Если этот элемент действительно существует, выражение будет оцениваться как true, и будет выполнен кодовый блок.
Однако:
if (document.getElementById('myElement') == true) {
// code block
}
... НЕ приведет к истинному условию, и блок кода не будет выполнен, даже если элемент существует.
Почему? Потому что document.getElementById()
является «истинным» выражением, которое будет оцениваться как истинное в этом if()
выражении, но это не фактическое логическое значение true
.
Двойное «не» в этом случае довольно просто. Это просто два not
спина к спине.
Первый просто «инвертирует» истинное или ложное значение, в результате чего получается фактический логический тип, а затем второй «инвертирует» его обратно в исходное состояние, но теперь в фактическое логическое значение. Таким образом, вы получите последовательность:
if (!!document.getElementById('myElement')) {}
и
if (!!document.getElementById('myElement') == true) {}
вернет ОБА как и ожидалось.