I'm going through the Discover Meteor demo, and am struggling to figure out how exactly 'return !! userId;' works in this section:
Posts.allow({ insert: function(userId, doc) { // only allow posting if you are logged in return !! userId; } });
September 02, 2014. If you have ever noticed a double exclamation mark (!!) in someone's JavaScript code you may be curious what it's for and what it does. It's really simple: it's short way to cast a variable to be a boolean (true or false) value.
This punctation emoji of a double exclamation mark features two big red exclamation points that can be used to express surprise, shock, or to really emphasize or drive home a point.
Use the number of exclamation points that's in your heart. Language is supposed to help you communicate what you mean, so if you need two exclamation points for an extra-emphatic opinion and 27 for an announcement to your brother about your promotion, go for it.
So the third use (!! x) turns the "falsey" value into a true boolean. ... with that in mind, the third exclamation point makes a TRUE negation of the original value (a negation of the "true boolean" value).
!
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With