I am trying to work out some obfusicated code by reading it, and I was doing pretty well until a came across this:
a = a && \"*\"
N
If a is truthy, it assigns "*" to a.
If a is falsy, it remains untouched.
&& has short-circuit semantics: A compound expression (e1) && (e2)—where e1 and e2 are arbitrary expressions themselves—evaluates to either
e1 if e1 evaluates to false in a boolean context—e2 is not evaluatede2 if e1 evaluates to true in a boolean contextThis does not imply that e1 or e2 and the entire expression (e1) && (e2) need evaluate to true or false!
In a boolean context, the following values evaluate to false as per the spec:
All1 other values are considered true.
The above values are succinctly called "falsy" and the others "truthy".
Applied to your example: a = a && "*"
According to the aforementioned rules of short-circuit evaluation for &&, the expression evaluates to a if a is falsy, which is then in turn assigned to a, i.e. the statement simplifies to a = a.
If a is truthy, however, the expression on the right-hand side evaluates to *, which is in turn assigned to a.
As for your second question: (e1) || (e2) has similar semantics:
The entire expression evaluates to:
e1 if e1 is truthye2 if e1 is falsy1 Exception