! is the logical negation or “not” operator. !! is ! twice. It’s a way of casting a “truthy” or “falsy” value to true or false, respectively. Given a boolean, ! will negate the value, i.e. !true yields false and vice versa. Given something other than a boolean, the value will first be converted to a boolean and then negated. For example, !undefined will first convert undefined to false and then negate it, yielding true. Applying a second ! operator (!!undefined) yields false, so in effect !!undefined converts undefined to false.
In JavaScript, the values false, null, undefined, 0, -0, NaN, and '' (empty string) are “falsy” values. All other values are “truthy.”(1):7.1.2 Here’s a truth table of ! and !! applied to various values:
value │ !value │ !!value ━━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━━━━ false │ ✔ true │ false true │ false │ ✔ true null │ ✔ true │ false undefined │ ✔ true │ false 0 │ ✔ true │ false -0 │ ✔ true │ false 1 │ false │ ✔ true -5 │ false │ ✔ true NaN │ ✔ true │ false '' │ ✔ true │ false 'hello' │ false │ ✔ true