Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does var = var && "*" mean in Javascript

Tags:

javascript

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 && "*"

Now I am still quite new to Javascript and these shortened uncommon javascript codes are still very foreign to me, this is the first time I have come across them.

Does anybody know what this does? I attempted it in a javascript code tester ad it just returned *, so I do not know.

Also, if anybody knows where I can look to find out what these uncommon lines of code do, that would be very helpful. They are all shortened and are sorts of things like this and

a = a || b

(I know what that one does)

But If there is some sort of name for this kind of javascript or a reference I can look at, that would be very helpful, I have been scouring Google for hours.

Thanks

like image 636
arch Avatar asked Dec 24 '12 09:12

arch


1 Answers

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 evaluated
  • e2 if e1 evaluates to true in a boolean context

This 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:

  • null
  • undefined
  • ±0
  • NaN
  • false
  • the empty string

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 truthy
  • e2 if e1 is falsy

1Exception

like image 119
phant0m Avatar answered Sep 26 '22 02:09

phant0m