-
Notifications
You must be signed in to change notification settings - Fork 190
/
about.html
138 lines (100 loc) · 6.15 KB
/
about.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
---
layout: page
title : 关于迷渡
header : 关于迷渡
---
{% include JB/setup %}
<p>
运行下面 javascript 代码,可以看到我的信息。
</p>
<pre>
<code>(+[[]+(1<<1<<1<<1)+(1^1<<1)+(1<<1>>1)+(-~1<<1<<1)+(1.1>>1.1)+(11>>>1)])[[(!!/-/+{})[111^111]+[[]+{}][!1&.1][1|1>>1|1]]+([111/[]+[]][+(1>1)][([]+{})[11-1>>1]+[[],[]+{}+[]][[]+1][1]+(/^/[1]+[])[1|1>>1|1]+[{},1e1,!{}+[]][1+1][1<<1^1]+(11/!{}+{})[~1+1e1+~1]+[!!{}+{}][[]&111][1&1]+(/^/[111]+[])[11^11]+[{},[{}]+{},1][1+[]][11-~1+11>>1]+(!!1+{})[1&1>>1]+([]+{1:1}+[])[1|1]+[[]+!!1][111>>>111][1<<1>>1]]+[])[([]+![111])[1|1<<1|1]+[/=/,[]+[][11]][1|[]][1>>1]+([{}]+{})[1+!![1]]+[1,!1+/~/][1%11][1^1<<1]+(111/[]+{})[~1+1e1+~1]+[!!/-/+/-/][111%111][+!!1]]((~1+1e1+1)+((!1&.1)==([]+/-/[(!![111]+{})[1^1]+(!![1]+[])[1<<1^1]+(!{}+{})[1^1<<1]+(!![1]+/-/)[+(1>1)]])[+(1>1)]),1-~1<<1)](~1-~1e1<<1<<1)+":"+(([]===[])+/-/)[5]+(([]===[])+/-/)[5]+(+[[]+(1e1>>1)+(~1+1e1+~1)+(!1&.1)+(111%11)+(1+1<<1)+(1<<1^11>>1)+(1<<1<<1)+(~1+1e1+1)+(+(1>1))+(+[])+(~1-1+11)+(-~1<<1<<1)+(1-~1<<1)+(~1+1e1)])[[(!!/-/+[])[11&[]]+[[]+{11:11}+[]][111>>111][1+[]]]+([11/!1+/1/][1&1>>1][([{}]+{})[1e1>>1|1]+[[],[]+{111:111}+[]][1|1][111%11]+([]+[][11])[1<<1>>1]+[{},1e1,!/~/+{}][1<<1^1>>1][1<<1^1]+([]+11/!{})[~1+1e1+~1]+[!![111]+[]][1%1][1&1]+([]+[][111])[.1^!1]+[{},[]+{},1][111%11][11-~1+11>>1]+([]+!!1)[111>>>111]+([]+{}+[])[[]+1]+[!!1+[]][1^1][111%11]]+[])[(!1+{})[1^1<<1]+[/=/,[]+/^/[11]][1|[]][11.11>>11.11]+([]+{}+[])[~~(1.1+1.1)]+[1,!{}+/~/][1][1|1<<1]+(1/!{}+[])[~1+1e1+~1]+[!![1]+{}][111.111>>111.111][1+[]]]((11^1<<1)+((1>>1)==([]+/-/[(!!/-/+/-/)[+(111>111)]+(!![11]+[])[1-~1]+(![11]+{})[1|1<<1|1]+(!!{}+[])[11%11]])[111.111>>111.111]),11+1>>1)](~1-~1e1<<1<<1)+"."+(+[[]+([]+1)+(1-~1<<1)+(1+1<<1)+(1|1<<1)+(1<<1<<1<<1)])[[(!!1+{})[!1&.1]+[[]+{}+[]][1&[]][1+[]]]+([11/[]+{}][+(111>111)][([{}]+[{}])[1e1>>1]+[[],[]+{}][[]+1][+!!1]+(/^/[111]+/&/)[1&1]+[{},1e1,!1+[]][1<<1][1^1<<1]+(111/!{}+/1/)[~1+1e1+~1]+[!!/-/+[]][11>>11][1|1]+([][1]+/&/)[1.1>>1.1]+[{},[{}]+{},1][~~1][1+1e1+1]+([]+!!1)[1^1]+([]+{})[1&1]+[!!1+{}][!1&.1][1|[]]]+[])[([]+!1)[1|1<<1|1]+[/=/,[]+/^/[11]][111%11][11.11>>11.11]+([{}]+[{}])[~~(1.1+1.1)]+[1,[]+!/~/][1|1>>1|1][1^1<<1]+([]+11/[])[11+1>>1]+[!!/-/+{}][+(1<1)][~~1]]((1e1-1)+((+[])==([]+/-/[(!!1+[])[!1&.1]+(!!/-/+/-/)[1|1<<1|1]+(!1+{})[1<<1^1]+(!![1]+/-/)[11>>11]])[111^111]),-~11>>1)](~1-~1e1<<1<<1)</code>
</pre>
<p>
<strong>2013-09-29 更新了<a href="https://justjavac.com/about-v2.html" target="_blank">升级版</a>。</strong>
</p>
<h2>如何实现的呢?</h2>
<p>
@OKter 说是 ASCII 码拼接。到底是不是呢?
</p>
<h2>第一步</h2>
<p>
先来个简单的,就以 <code>justjavac</code> 为例吧。首先我们要输出 <code>j</code>。
</p>
<p>
下面这段代码可以输出 <code>j</code>:
</p>
<pre>
<code>(1+{})[4]</code>
</pre>
<p>
<strong>解释</strong>:代码 <code>1+{}</code> 的结果是 <code>"1[object Object]"</code>,
显然,我们得到了一个包含 j 的字符串。但为什么会如此奇怪呢?毕竟我们都期望 <code>1+{}</code> 的结果应该是 1。
</p>
<h3>对象加法</h3>
<p>有下面这样的一个加法操作。</p>
<pre><code>value1 + value2
</code></pre>
<p>在计算这个表达式时,内部的操作步骤是这样的 (§11.6.1):</p>
<ol>
<li><p>将两个操作数转换为原始值 (以下是数学表示法的伪代码,不是可以运行的 JavaScript 代码):</p>
<pre><code> prim1 := ToPrimitive(value1)
prim2 := ToPrimitive(value2)
</code></pre>
<p> <code>PreferredType</code> 被省略,因此 <code>Date</code> 类型的值采用 <code>String</code>,其他类型的值采用 <code>Number</code>。</p></li>
<li><p>如果 prim1 或者 prim2 中的任意一个为字符串,则将另外一个也转换成字符串,然后返回两个字符串连接操作后的结果。</p></li>
<li><p>否则,将 prim1 和 prim2 都转换为数字类型,返回他们的和。</p></li>
</ol>
<p>
更多详细内容参考 <li><a href="https://justjavac.com/javascript/2012/12/20/object-plus-object.html" target="_blank">JavaScript中,{}+{}等于多少?</a></li>
</p>
<p>
由于字符串可以当作数组一样取里面的元素,于是 <code>(1+{})[4]</code> 就得到了 j。
</p>
<h2>第二步</h2>
<p>
既然我们得到了 j,那下一步就是 u 了。我们还是按照这个思路,哪个字符串里面还有 u 呢?
在 javascript 中确实有这么一个特殊的值,含有 u: "undefined",思来想去,可以使用这段代码:
</p>
<pre>
<code>/1/[1]+[]</code>
</pre>
<p>
分开解释:
</p>
<ol>
<li><p><code>/1/</code> 是一个正则表达式</p></li>
<li><p>当他后面跟上 [] 时,被强制转换成了数组,然后去取里面的元素(第二个元素),得到的结果是 undefined(注意:是 undefined 值,不是字符串)</p></li>
<li><p>把 undefined 转换成字符串,在这里我们把它和数组相加。</p></li>
</ol>
<p>
呵呵,上面使用正在表达式 <code>/1/</code> 有点儿卖弄的嫌疑,其实用 <code>1[1]</code> 就够了。
为了更有 geek 感,可以多出现 0 和 1。通过 <code>/1+/[+0]+[+1]</code> 我们可以得到字符串 "undefined1"。
</p>
<p>
使用数组操作符把我们想要的 u 提取出来, <code>(/1+/[+0]+[+1])[0]</code>。
</p>
<p>
现在我们已经得到了字符串 "ju" 了。按照这种方法,我们可以得到其他的字符串。没有做不到的,只有想不到的。
</p>
<h2>问题来了</h2>
<p>
用这种方法能拼出所有的字符吗? @长夜 则提出了更深的问题: “可以拼中文吗?”
</p>
<p>
@TODO 待续……
</p>
<h2>大功告成</h2>
<p>
当我们得到了所有的字符串,就可以使用 + 号把他们连接起来。
你以为这就完了吗?当然远远没有,我们应该让我们的代码更 Cool,更有 geek 范。
</p>
<h2>相关阅读:</h2>
<ul>
<li><a href="https://justjavac.com/javascript/2013/04/08/javascript-quirk-1-implicit-conversion-of-values.html" target="_blank">JavaScript 的怪癖 1:隐式类型转换</a></li>
<li><a href="https://justjavac.com/javascript/2012/05/24/can-you-explain-why-10.html" target="_blank">为什么 ++[[]][+[]]+[+[]] = 10?</a></li>
</ul>
<p>
</p>
<hr/>
</div>