В чём разница между! и !!?

В JavaScript оператор "!"" (логическое НЕ) используется для инвертирования значения выражения, то есть, если выражение истинно, то "!" сделает его ложным, и наоборот. Например:

var x = 5;
console.log(!x); // false, так как 5 - истина, а ! инвертирует её в ложь

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

var y = 0;
console.log(!!y); // false, так как 0 - ложь, и !! не меняет это значение

Важно отметить, что оператор "!!" рекомендуется использовать, когда вам нужно явно преобразовать значение в логический тип данных (булевый тип). Например, оператор "!!" может быть полезен при проверке наличия значения, так как он преобразует его в логическое значение true или false, в зависимости от наличия или отсутствия значения.