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;
- 而且这个对我来说真的很难,我无法假设任何解释
据我了解:
- "o" 计算为 s + "/w",然后与 "-" 连接,然后与 ".html" 连接?是否有任何条件适用于该字符串构建,我的意思是,这两个串联中的任何一个都可以按此代码中的条件应用吗?
- 比较 == 运算符在语句中做了什么("en" == r.language... 部分),哪个变量接收该结果?或者它可能只是一个混淆技巧?
最后一个,在最后一个逗号之后,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
。
我需要了解一些代码。我觉得 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;
- 而且这个对我来说真的很难,我无法假设任何解释
据我了解:
- "o" 计算为 s + "/w",然后与 "-" 连接,然后与 ".html" 连接?是否有任何条件适用于该字符串构建,我的意思是,这两个串联中的任何一个都可以按此代码中的条件应用吗?
- 比较 == 运算符在语句中做了什么("en" == r.language... 部分),哪个变量接收该结果?或者它可能只是一个混淆技巧?
最后一个,在最后一个逗号之后,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
。