Javascript 逗号语法和复杂表达式,缩小,混淆:请帮助我理解一段代码

Javascript comma syntax, and complex expressions, minified, obfuscated: please help me understand a piece of code

我需要了解一些代码。我觉得 Java、C++、PHP 的语法很好,但是 Javascript 语法对我来说仍然是 "dark forest"。以下是原始形式和可能的解释,我的意思是程序逻辑方面的等价物:

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;

我几乎可以肯定这一点,在这里我可以用分号替换逗号并在每行的开头添加 VAR 语句,它会产生相同的结果,对吗?

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;
  1. 而且这个对我来说真的很难,我无法假设任何解释

据我了解:

  1. "o" 计算为 s + "/w",然后与 "-" 连接,然后与 ".html" 连接?是否有任何条件适用于该字符串构建,我的意思是,这两个串联中的任何一个都可以按此代码中的条件应用吗?
  2. 比较 == 运算符在语句中做了什么("en" == r.language... 部分),哪个变量接收该结果?或者它可能只是一个混淆技巧?
  3. 最后一个,在最后一个逗号之后,r.banner_id || (r.banner_id = "22995c4e");这是一个作业,很清楚,但这部分的其他内容有什么意义?此处的赋值是按条件进行的吗(如果r.banner不是undefined-or-null-or-false)?

    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");

"en" == r.language && (o += "-" + r.language.toString().toLowerCase()),

哦...这条线很棘手。

因此,例如:如果您要编写 var myVar = false && thisFunctionThrowsError(),如果调用该函数会抛出异常,那么实际上 而不是 return 一个错误 - 因为不会评估&符号之后的任何内容。这称为短路评估。在这种情况下,有人把他检查&&比较结果的部分删掉了,只用它来判断是否运行右边。

所以,如果我写:

"biletik" == r.theme && (o += "-");

这意味着只有在 r.theme == 'biletik'.

时,它才会在 o 中添加破折号

最后一行相反;它看起来像是一个惰性初始化器。如果 r.banner_id 为 null,则计算结果为 false - 因此它 运行 是 || 的第二部分,将其初始化为 22995c4e