Что означает два восклицательных знака "!!" перед выражением? — Q&A Хекслет
2026-02-26 17:06 Diff

Прежде всего давайте вспомним что вообще делает восклицательный знак в обычных ситуациях. Он является логическим оператором "не". Простой пример, проверяем что выражения между собой равны:

Если хотим проверить что они не равны, то добавляем восклицательный знак:

То есть мы "перевернули" (инвертировали) проверку. Примерно то же самое происходит, когда мы добавляем восклицательный знак перед любым выражением:

Обратите внимание, перед myVar стоит восклицательный знак, это отрицание, то есть можно прочитать это как "не myVar". Восклицательный знак инвертирует наше выражение, которое является строкой 'test'. Но тут возникает вопрос: а что является не строкой 'test'? Если подойти к вопросу философски, то можно найти бесконечное множество вещей, которые являются не строкой 'test'. Но у интерпретатора JS на этот счёт есть чёткое правило: он вычисляет выражение справа от восклицательного знака так, чтобы получить либо true, либо false, то есть приводит к булевому типу. Строка 'test' приводится к булевому типу и вычисляется как true, а восклицательный знак инвертирует, то есть переворачивает true на false, так как false является противоположностью true.

Теперь гораздо легче понять что делают два восклицательных знака:

Интерпретатор пытается вычислить сначала !content. Если content будет ложным выражением, то вычислится true, если истинным, то false. А второй восклицательный знак переворачивает true на false, а false на true. В итоге, если контент существует, то функция вернёт true, а если не существует, то false.

Теперь возникает вопрос: зачем вообще это нужно? Это делается чтобы мы всегда работали с определённым типом. Такой хитрый способ позволяет нам добиться чтобы функция всегда возвращала булевый тип. Любое значение будет преобразовываться в этот булевый тип. Это называется приведение типов.