JavaScript(67 66 62行 227 269字节)
(注意:仅在Firefox 36和Safari 8上进行过测试,包含较小的ES6功能(Set
该类))
Z
=
!""+
(0[[]]
+
(
!!""+Set
));c
=Z[~
-22]
$=Z[
3]
$$=Z[
15]
$$$=Z[
24]
$$$$=Z[
1]
$$$$$=Z[
0]
Set
[c
+
$$$+Z[
5]
+Z[
16]
+
$$$$$+
$$$$+Z[
2]
+c
+
$$$$$+
$$$+
$$$$]
(Z[
14]
+
$$+
$+
$$$$+
$$$$$+
"(\
'H\
"+
$+
$$+
$$+
$$$+
",\
W\
"+
$$$+
$$$$+
$$+Z[
6]
+
"\
!')\
")
()
上面的代码基本上可以做到:
alert("Hello, World!")
显然alert
没有排序。因此,我们需要将语句生成为字符串,然后对其进行“评估”:
s = "alert('Hello, World!')"; // generate this using sorted code
eval(s)
如何生成字符串?ES5支持行连续,因此
"AL\
ERT" === "ALERT"
但是字符代码\
出现在所有小写字母之前,因此我们必须使用其他方法来生成小写字母。
我们在这里借用JSFuck的一些想法。警报语句中涉及的小写字母为:
t e r a o l d
所有这些都可以从标准对象的字符中提取,这些字符可以按某种排序顺序表示:
t, e, r ← true = !""
a, l ← false = !!""
o ← function = Set
d ← undefined = 0[[]]
我们如何评估字符串?当然我们不能使用,eval(s)
因为它没有排序。或者,我们可以使用Function(s)()
,但Function
由于也未排序,因此我们无法使用。但是,Function
是所有函数的构造函数,即Set.constructor === Function
。
添加标识符constructor
会使小写字母列表变为:
t e r a o l d c u n s
幸运的是,它仍然可以通过"truefalseundefinedfunction"
以下方式生成:
t, e, r, u ← true = !""
a, l, s ← false = !!""
o, c, n ← function = Set
d ← undefined = 0[[]]
美化之后,上面的代码应如下所示:
// lines 1~8 defines our string containing all lowercase letters we want
Z = true + (undefined + (false + Set))
// Z = "trueundefinedfalsefunction Set() { [native code] }"
// lines 8~20 defines the variables `c`, `$` (e), `$$` (l), `$$$` (o),
// `$$$$` (r), `$$$$$` (t)
// for the corresponding lowercase letters extracted from `Z`
// the rest calls:
Set["constructor"]("alert('Hello, World')")()
// lines 22~36 generates the "constructor" string
// lines 37~61 generates the "alert('Hello, World')" string
更新:重命名E
,L
,O
,R
,T
对各种重复$
以减少4行。