5

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

connexo
  • 53,704
  • 14
  • 91
  • 128
arch
  • 477
  • 1
  • 9
  • 17
  • Duplicate of [What does “options = options || {}” mean in Javascript?](http://stackoverflow.com/questions/2851404/what-does-options-options-mean-in-javascript) and [JavaScript. What does this expression mean: “ var a = b === c && d; ”](http://stackoverflow.com/questions/10896453/javascript-what-does-this-expression-mean-var-a-b-c-d). It's called short-circuit evaluation, read more at https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Logical_Operators#Short-Circuit_Evaluation – Rob W Dec 24 '12 at 10:00
  • Could have been written as (i) `if (a) {a="*";}` (ii) `if (!a) {a=b;}` – Salman A Dec 24 '12 at 10:10
  • @SalmanA Yes, that's correct. – Rob W Dec 24 '12 at 10:21

1 Answers1

8

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

1 Exception

Community
  • 1
  • 1
phant0m
  • 16,595
  • 5
  • 50
  • 82
  • 2
    "Now I am still quite new to Javascript". As a novice JavaScript programmer, the OP might need a better explanation to understand the concept. – Rob W Dec 24 '12 at 10:04