Что означает два восклицательных знака "!!" перед выражением?
Что означает, когда пишут два восклицательных знака перед переменной или любым другим выражением? Например:
4 года назад
Ivan Gagarinov
Ответы
Прежде всего давайте вспомним что вообще делает восклицательный знак в обычных ситуациях. Он является логическим оператором "не". Простой пример, проверяем что выражения между собой равны:
Если хотим проверить что они не равны, то добавляем восклицательный знак:
То есть мы "перевернули" (инвертировали) проверку. Примерно то же самое происходит, когда мы добавляем восклицательный знак перед любым выражением:
Обратите внимание, перед myVar стоит восклицательный знак, это отрицание, то есть можно прочитать это как "не myVar". Восклицательный знак инвертирует наше выражение, которое является строкой 'test'. Но тут возникает вопрос: а что является не строкой 'test'? Если подойти к вопросу философски, то можно найти бесконечное множество вещей, которые являются не строкой 'test'. Но у интерпретатора JS на этот счёт есть чёткое правило: он вычисляет выражение справа от восклицательного знака так, чтобы получить либо true, либо false, то есть приводит к булевому типу. Строка 'test' приводится к булевому типу и вычисляется как true, а восклицательный знак инвертирует, то есть переворачивает true на false, так как false является противоположностью true.
Теперь гораздо легче понять что делают два восклицательных знака:
Интерпретатор пытается вычислить сначала !content. Если content будет ложным выражением, то вычислится true, если истинным, то false. А второй восклицательный знак переворачивает true на false, а false на true. В итоге, если контент существует, то функция вернёт true, а если не существует, то false.
Теперь возникает вопрос: зачем вообще это нужно? Это делается чтобы мы всегда работали с определённым типом. Такой хитрый способ позволяет нам добиться чтобы функция всегда возвращала булевый тип. Любое значение будет преобразовываться в этот булевый тип. Это называется приведение типов.
4 года назад
Ivan Gagarinov
Еще можно добавить, что в javascript следующие значения будут приведены к булевому типу false:
- undefined
- null
- NaN
- 0 (число ноль)
- '' (пустая строка)
В английской литературе эти значения называются falsy values.
[undefined, null, NaN, 0, ''].map((val) => !!val);
// => [ false, false, false, false, false ]
// или можно так: [undefined, null, NaN, 0, ''].map((val) => Boolean(val))год назад
Дмитрий Чувиковский





