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; } }); 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; } }); ! 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 |
!!"false" #=> trueconsole.log(Boolean(12)); > truelet array = [1, 2 ,3]; !!array.length && ...do something...== operator to compare two operands. This will coerce values to some other type for the sake of the comparison and give unexpected results. You're better off using === or !== for comparison in JS as it will take into account the type and not do any conversion. stackoverflow.com/a/359509/2565869