I need to understand some pieces of code. I feel fine with the syntax of Java, C++, PHP, but JavaScript syntax is still a "dark forest" for me. Here are the original forms and possible interpretations, I mean equivalents in terms of program logic:
1.
var o,
a,
s = "https://widget.kiwitaxi.com",
c = e.createElement("iframe"),
l = e.getElementById(r.target),
p = r && r.height_bias ? 4 + r.height_bias : 4,
u = !1,
f = parseInt(r.min_height, 10)
? parseInt(r.min_height, 10)
: r.hide_form_extras && !r.default_form_title
? 304
: 386;
I'm almost sure about this one, here I can replace commas with semicolons and add var
statement to the beginning of each line, and it will produce the same results, am I right?
var o;
var a;
var s = "https://widget.kiwitaxi.com";
var c = e.createElement("iframe");
var l = e.getElementById(r.target);
var p = r && r.height_bias ? 4 + r.height_bias : 4;
var u = !1;
var f = parseInt(r.min_height, 10)
? parseInt(r.min_height, 10)
: r.hide_form_extras && !r.default_form_title
? 304
: 386;
And this one is really tough for me, I cannot presume any interpretation.
o = s + "/w",
"en" == r.language && (o += "-" + r.language.toString().toLowerCase()),
("biletik" == r.theme || "ostrovok" == r.theme) &&
(o += "-" + r.theme.toString().toLowerCase()),
o += ".html",
r.banner_id || (r.banner_id = "22995c4e");
As I understand:
o
" is evaluated to s + "/w"
, then is concatenated with "-"
, and then with ".html"
? Are any conditions applied to that string building, I mean, can any of that two concatenations be applied by condition in this code?==
operator do in the statement (the part "en" == r.language...
), which variable receives that result? Or can it be just an obfuscation trick?r.banner_id || (r.banner_id = "22995c4e");
Here goes an assignment, that is clear, but what is the point of other stuff in this part? Is the assignment made by condition here (if r.banner is not undefined-or-null-or-false
)?"en" == r.language && (o += "-" + r.language.toString().toLowerCase()),
Ooh...that line's tricky.
So, example: If you were to write var myVar = false && thisFunctionThrowsError()
, where the function would throw an exception if it were called, that would actually not return an error - because anything after the ampersand won't be evaluated. It's called short-circuit evaluation. In this case, someone has cut out the part where he checks the result of the &&
comparison, and only uses it to determine whether or not to run the right side.
So, if I write:
"biletik" == r.theme && (o += "-");
That means it will add a dash to o
only if r.theme == 'biletik'
.
The last line is the opposite; it looks like it's a lazy-initializer. If r.banner_id
is null, that evaluates to false - so it runs the second part of the ||
, initializing it to 22995c4e
.