【JavaScript】10種類の文字とwindow,文字列'CogS'だけでHelloWorld（前編）

[以前の投稿][prev]で、`window`オブジェクトと`'SCgohm'`という文字列があれば
`(_,)=>!-[]`などのいくつかの文字だけを使ってJavaScriptを難読化できそうみたいな話をしたんですが、
よく考えると文字列は`'CogS'`だけで済みそうと気づいたので
とりあえずHelloWorldを難読化してみます。
使う文字は少し変わって`(_,)=>!+[]`です。

[prev]:https://qiita.com/po_tau_feu/items/4b05ff1bd4479842562b

目標は次の関数と同じ仕事をするものです。

```javascript:HelloWorld.js
function helloWorld(){
    console.log('Hello, World!');
}
```
実行するとコンソールに`Hello, World!`と表示するプログラムですね。

# 1.下準備
まずはじめに、やんごとなき理由から、関数の定義を関数式に置き直します。

```javascript:HelloWorld1-0.js
const helloWorld = function(){
    console.log('Hello, World!');
};
```
続いて、この関数式を返す関数を即時実行して代入するスタイルに変更します。

```javascript:HelloWorld1-1.js
const helloWorld = (function(){
    return function(){
        console.log('Hello, World!');
    };
})();
```
なんでこんなことをしたかというと、
`'(_,)=>!-[]'`という文字だけで記述する部分を限定するためです。
この即時間数の中だけ`'(_,)=>!-[]'`という文字のみで記述するのを目的とします。

## 1.1. `window`と`'CogS'`の準備
`window`と`'CogS'`を使うたびにこれらの文字を記述していては意味がないので、
`_`という文字だけを使ってこれらにアクセスできるように、

```javascript:HelloWorld1-2.js
const helloWorld = (function(_,__){
    return function(){
        console.log('Hello, World!');
    }
})(window,'CogS');
```
てな感じで即時関数の引数に入れてしまいましょう。
これで即時関数の中で`window`と`'CogS'`を自由に使えるようになりました。
ただ、このままではあまりにも分かりにくくなるので、
一旦は原型を止めた変数名に変えておきましょう。

```javascript:HelloWorld1-3.js
const helloWorld = (function(w,cogs){
    return function(){
        console.log('Hello, World!');
    }
})(window,'CogS');
```
## 1.2. 変数置き場の準備
HelloWorldくらいなら変数を置いておく場所がなくても書けるんですが、
同じ記述が何度も出てきてしまうので、
変数入れる場所として配列を用意してあげましょう。

```javascript:HelloWorld1-4.js
const helloWorld = (function(w,cogs){
    v = [];
    return function(){
        console.log('Hello, World!');
    }
})(window,'CogS');
```
もちろんこの`v`という文字は、あとで`___`などに置き直します。

`const`や`let`や`var`と書けないので宣言なしで書いてしまいましたが、
このままだとグローバル的な変数の`v`に配列が入ってしまいます。

このスクリプトより後に読み込まれたスクリプトで、
`undefined`がほしくて`window.v`にアクセスする人がいたら困りますし、
これより前に読み込まれたスクリプトの先頭に
無情にも`'use strict'`と書かれていればそもそも動かなくなります。

なのでこいつは、即時関数の引数とみなしてあげましょう。

```javascript:HelloWorld1-5.js
const helloWorld = (function(w,cogs,v){
    v = [];
    return function(){
        console.log('Hello, World!');
    }
})(window,'CogS');
```
これで他人の心配をしなくて済むようになりました。

# 2. 関数名の文字列化

まずは関数名やオブジェクト名を直接書かなくていいように文字列にしましょう。
`console`オブジェクトは実は`window.console`オブジェクトで、
`window`オブジェクトのプロパティとしてアクセスできます。
そして、プロパティには`.`でつなげる以外にも、`window['console']`という書き方があります。
`console.log`についても同様に`console['log']`として、こいつらを組み合わせると、

```javascript:HelloWorld2-1.js
const helloWorld = (function(w,cogs,v){
    v = [];
    return function(){
        w['console']['log']('Hello, World!');
    }
})(window,'CogS');
```
という風になり、`console`や`log`と直接記述せずに`console.log`を呼べるようになりました。
あとは`'console'`,`'log'`,`'Hello, World!'`という文字列を用意してやるだけです。

イメージとしては

```javascript:HelloWorld2-1.js
const helloWorld = (function(w,cogs,v){
    v = [
        'console',
        'log',
        'Hello, World!'
    ];
    return function(){
        w[v[0]][v[1]](v[2]);
    }
})(window,'CogS');
```
こんな感じですね。

# 3. 文字の準備
## 3.1. `String.fromCharCode`がほしい
さて、文字列を使わずに文字列を定義するのはどうすればいいでしょうか。
パッと思いつきそうなのは、`String.fromCharCode`です。
こいつがいれば、数字さえ用意できればJavaScriptで扱えるどんな文字でも手に入れられるはずです。
数字の入手方法はあとで考えるとして、まずは`String.fromCharCode`を呼ぶ方法を考えましょう。

まずは、先程と同じように、オブジェクトや関数を文字列に置き直すと、

```javascript:String.fromCharCode-0
String.fromCharCode
```
と書くべきところを

```javascript:String.fromCharCode-1
w['String']['fromCharCode']
```

と書けば済むようになります。
ではこの文字列をどうやって用意すればいいでしょうか。
とりあえずここで`cogs`に入っている`'CogS'`を利用してみましょう。

```javascript:String.fromCharCode-2
w[cogs[3]+'trin'+cogs[2]]['fr'+cogs[1]+'m'+cogs[0]+'har'+cogs[0]+cogs[1]+'de']
```
なんのこっちゃわからないかもしれませんが、
単に`'String'`,`'fromCharCode'`の中にある`'C'`,`'o'`,`'g'`,`'S'`を、
それぞれ`cogs[0]`,`cogs[1]`,`cogs[2]`,`cogs[3]`で置き換えただけです。

難読化としてはこのままでもそれなりな気がしますが、
目的は難読化ではないので残っている文字が問題です。
**小文字**の`'t'`,`'r'`,`'i'`,`'n'`,`'g'`,`'f'`,`'m'`,`'h'`,`'a'`,`'d'`,`'e'`,が足りません。
実はこれらの一部は後述する方法で手に入るのですが、
それでも`'g'`,`'m'`,`'h'`は（僕の知る限り）手に入れられません。
別の方法を考える必要があります。

## 3.2. 小文字がほしい
こうなってくるとどんな小文字でも返してくれる関数がほしくなります。
そんな都合のいい関数があるでしょうか。

あります。

この事実に気づいてなかったので、[以前の投稿][prev]では`'SCgohm'`という文字が欲しかったのです。
例えば`'console'`という文字列がほしかったら、次のように書きましょう。

```javascript:'console'-0
27612545666..toString(36)
```
知ってる人でないと意味が分からないかもしれません。

亜種として、次の2文を見てください。

```javascript:`abadface`
0xABADFACE.toString(16)
2880305870..toString(16)
```
これらはどちらも`'abadface'`という文字列を返します。
1文目は簡単ですね。16進数で`ABADFACE`となる数字を16進数で書いたものです。
2文目の`2880305870`という10進数の数字は、16進数で`ABADFACE`となるので同じ結果が帰ってくるというわけです。
こっそり悪口を仕込みたい場合に、1文目のように書くとすぐバレますが、
2文目のように書けばすぐにはバレないでしょう[^1]。


原理はこれと同じです。
よく使われるr進数は2進数、8進数、10進数、16進数くらいのものですが、
JavaScriptでは2進数から36進数まで使えます。
アラビア数字は10個しかシンボルがないので、
残った26個のシンボルとしてアルファベットの小文字が使われます。
16進数と同じように、`a`は`10`を、`b`は`11`を、というのを、
そのまま続けて`z`まで行くと、これは`35`を表しています。


最初の記述に戻って、

```javascript:'console'-0
27612545666..toString(36)
```
ですが、これは36進数で`console`と表される数`27612545666`を36進表記で書いたものなので、
`'console'`という文字列が返ってくるのでした。

ちなみに、`'console'`には`28`を表現するシンボルである`s`より後の文字が含まれていないので、

```javascript:'console'-1
7647118590..toString(29)
```
と書いても`'console'`が返ってきます。
この辺は好みで使い分けてください。
`Number.MAX_SAFE_INTEGER`を超えなければ大丈夫でしょう。

## 3.3. `toString`がほしい
それでは`String.fromCharCode`を記述するために、
まずは`'tring'`という文字列を用意しましょう。
次のように書けば`'tring'`が返ってきます。

```javascript:'tring'-0
49992748..toString(36)
```
そういえば使える文字は`'(_,)=>!-[]'`だけだったので、ピリオドを使わずに、

```javascript:'tring'-2
(49992748)['toString'](36)
```
と書き直します。

ここで使われている`'toString'`という文字列を作るには、
`cogs`を使っても、`'t'`,`'r'`,`'i'`,`'n'`が足りません。
これを用意する方法を考えてみましょう。


### 3.3.1. `'t'`がほしい

`t`で始まる単語で、JavaScriptを使っているとたまに使うことになるかもしれないものがあります。
それは`true`です。
`true.toString()`とすれば、文字列`'true'`が手に入るので、その0番目の要素を取り出せば`'t'`という文字が作れます。

`toString`のために`toString`を使うと堂々巡りになってしまうため、
実際には別の方法で`true`を文字列にします。

JavaScriptには、数字でないものを足そうとすると、
文字列の結合とみなして勝手に`toString`してくれたりする機能があります。
例えば、

```javascript:'true'-0
'' + true
```
とすれば、`'true'`が返ってきます。
この機能は別に文字列で始める必要があるわけではないようで、

```javascript:'true'-1
[] + true
```
としても、`[].toString()`と`true.toString()`を結合して`'true'`を返してくれます[^2]。

ここで、trueをどうやって用意するかですが、
みんな大好き`!+[]`を使えば手に入ります。
`+[]`が`0`と評価され、それをブール値とみなして論理反転して`true`が返ってくるという仕組みです。

これらをまとめると、次のようにすれば文字`'t'`が手に入ります。

```javascript:'t'
([]+!+[])[+[]]
```

### 3.3.2. `'r'`,`'i'`,`'n'`がほしい
ここまでくればあとはやり方は同じです。
`'r'`は`'true'`に含まれているので、

```javascript:'r'
([]+!+[])[+!+[]]
```
として1番目の要素をとってくれば済みます。

`'i'`,`'n'`ですが、これらは`undefined`に含まれているので、

```javascript:'i'-0
([]+[][+[]])[5]
```
```javascript:'n'
([]+[][+[]])[+!+[]]
```
とすることで手に入ります。

ここで、`'i'`の方には`5`という少し大きな数字があります。
`!+[]+!+[]+!+[]+!+[]+!+[]`としてもいいのですが、次のように書くと少しスマートです。

```javascript:'i'-1
([![]]+[][+[]])[[+!+[]]+(+[])]
```
これは何をしているのかというと、
`'false'`と`'undefined'`を結合して`'falseundefined'`という文字列を作り、
その10番目の要素である`'i'`にアクセスするのに
`'1'`と`'0'`を結合してできた`'10'`という文字列を使っています。

分解すると次のような感じです。

```javascript:'i'-2
(
     [![]]      // [false]
    +[][+[]]    // + undefined
)[              // falseにundefinedを直接足すとNaNになるので注意
     [+!+[]]    // [1]
    +(+[])      // + 0
]               // 当たり前ですがこっちも直接足すと1になります

// 最終的に('false'+'undefined')['1'+'0'] -> 'falseundefined'['10']
```

### 3.3.3. みんなの希望`toString`
これで`toString`を記述するのに必要なパーツが揃いました。
早速書き下してみましょう。

```javascript:'toString'-0
([]+!+[])[+[]]+cogs[+!+[]]+cogs[!+[]+!+[]+!+[]]+([]+!+[])[+[]]+([]+!+[])[+!+[]]+([![]]+[][+[]])[[+!+[]]+(+[])]+([]+[][+[]])[+!+[]]+cogs[!+[]+!+[]]
```
```javascript:'toString'-1
 ([]+!+[])[+[]]                 //t
+cogs[+!+[]]                    //o
+cogs[!+[]+!+[]+!+[]]           //S
+([]+!+[])[+[]]                 //t
+([]+!+[])[+!+[]]               //r
+([![]]+[][+[]])[[+!+[]]+(+[])] //i
+([]+[][+[]])[+!+[]]            //n
+cogs[!+[]+!+[]]                //g
```
下のはわかりやすく改行しただけです。

さて、この`toString`ですが何度もお世話になることになるので毎回書いていられません。
変数置き場に置いておきましょう。

```javascript:HelloWorld3-1.js
const helloWorld = (function(w,cogs,v){
    v = [
        ([]+!+[])[+[]]+cogs[+!+[]]+cogs[!+[]+!+[]+!+[]]+([]+!+[])[+[]]+
                ([]+!+[])[+!+[]]+([![]]+[][+[]])[[+!+[]]+(+[])]+([]+[][
                +[]])[+!+[]]+cogs[!+[]+!+[]]
    ];
    return function(){
        w['console']['log']('Hello, World!');
    }
})(window,'CogS');
```

`'toString'`を変数置き場の配列の0番目の要素に入れています。
あとあまりにも長いので適当に改行しています。
改行位置は意味のあるまとまり等ではありません。

これで今度から`'toString'`がほしい時は`v[+[]]`として
`v`の0番目の要素にアクセスするだけで済みます。

## 3.4. 満を辞して`String.fromCharCode`
`toString`がいれば小文字なんか怖くないので、
さっさと`String.fromCharCode`も用意してしまいましょう。

```javascript:'String'-0
 cogs[3]                    //'S'
+(49992748)['toString'](36) //'tring'
```
```javascript:'fromCharCode'-0
 (735718)['toString'](36)   //'from'
+cogs[0]                    //'C'
+(22419)['toString'](36)    //'har'
+cogs[0]                    //'C'
+(31586)['toString'](36)    //'ode'
```
さて、ここで大きな整数がたくさん出てきています。
例えば`36`は、次のようにすれば得られます。

```javascript:36
+(                                      //文字列'36'を数字として評価する
     [!+[]+!+[]+!+[]]                   //'3'
    +[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]    //+'6'
)
```
これをすべての数字でいちいち手書きしてたら気が遠くなるので、
整数を`(+![])`だけを使った表現に置き換える関数を用意しておきましょう。

```javascript:ConvertNum.js
const convertNum = n=>'+('+n.toString().replace(/\d/g,d=>{
    if(d==='0'){
        return "[+[]]+"
    }
    let str = d==='1'?'[+':'[';
    str += [...Array(parseInt(d,10))].map(e=>'!+[]').reduce((a,b)=>a+'+'+b);
    str += ']+';
    return str;
}).replace(/\+$/,')');
```

この関数の解説は割愛しますが、これでいちいち手書きで整数を置き換えなくて済みます。
数字ごとに変換するなり、
ソースを読み込んで`.replace(/\b\d+\b/g,convertNum)`するなりしましょう。

`'String'`と`'fromCharCode'`は、それぞれ次のようになります。

```javascript:'String'-1
/* S */      cogs[!+[]+!+[]+!+[]]
/* tring */ +(+([!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))['toString'](+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))
```
```javascript:'fromCharCode'-1
/* from */  (+([!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))['toString'](+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))
/* C */    +cogs[+[]]
/* har */  +(+([!+[]+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))['toString'](+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))
/* C */    +cogs[+[]]
/* ode */  +(+([!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))['toString'](+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))
```
馬鹿馬鹿しいのでもう改行はしていません。
これでやっと`String.fromCharCode`を次のように呼べるようになりました。
この中の`'toString'`を`v[+[]]`で置き換えてやると、次のように書けます。

```javascript:String.fromCharCode-3
w[/* String */
    cogs[!+[]+!+[]+!+[]]+(+([!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+
            !+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+
            []+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
            ]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+
            []+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))[v
            [+[]]](([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))
][/* fromCharCode */
    (+([!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]
            +!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[
			]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))[v[+[]]](+([!
			+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))+cogs[+[]]+
			(+([!+[]+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[+!+[]]+[!
			+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))[v[+[]]](+([!
			+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))+cogs[+[]]+
			(+([!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[
			]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+
			!+[]+!+[]]))[v[+[]]](+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[
			]+!+[]+!+[]]))
]
```

こいつを変数置き場に突っ込んでおきましょう。

```javascript:HelloWorld3-2.js
const helloWorld = (function(w,cogs,v){
    v = [
        ([]+!+[])[+[]]+cogs[+!+[]]+cogs[!+[]+!+[]+!+[]]+([]+!+[])[+[]]+
                ([]+!+[])[+!+[]]+([![]]+[][+[]])[[+!+[]]+(+[])]+([]+[][
                +[]])[+!+[]]+cogs[!+[]+!+[]]
    ];
    v[+!+[]] = w[cogs[!+[]+!+[]+!+[]]+(+([!+[]+!+[]+!+[]+!+[]]+[!+[]+!+
            []+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]
			+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!
			+[]+!+[]+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!
			+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!
			+[]+!+[]]))[v[+[]]](([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+
			!+[]+!+[]]))][(+([!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]
			+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]
			+!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[
			]+!+[]]))[v[+[]]](+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!
			+[]+!+[]]))+cogs[+[]]+(+([!+[]+!+[]]+[!+[]+!+[]]+[!+[]+!+[]
			+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[
			]+!+[]]))[v[+[]]](+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!
			+[]+!+[]]))+cogs[+[]]+(+([!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[
			]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]
			+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))[v[+[]]](+([!+[]+!+[]+!+[
			]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))];
    return function(){
        w['console']['log']('Hello, World!');
    }
})(window,'CogS');
```

これで、`String.fromCharCode`を呼びたくなったら`v[+!+[]]`とだけ書けばよくなりました。

## 3.5. 禁断の秘術`eval`
`String.fromCharCode`を手に入れたので、
どんな文字でも書けるようになりました。
どんな文字でも書けるということは、つまり

```javascript
"()=>console.log('Hello, World!')"
```
という文字列も書けるわけです。
もちろん、

```javascript
'eval'
```
なんて文字列はお茶の子さいさいです。

さて、ここで

```javascript
w['eval']("()=>console.log('Hello, World!')")
```
は何が返ってくるでしょうか。

実行するとコンソールに`Hello, World!`と表示するプログラムですね。
目的は達成されました。
次のようにすれば`"()=>console.log('Hello, World!')"`が得られます。

```javascript:HelloWorldFunctionString
[+([!+[]+!+[]+!+[]+!+[]]+[+[]]),+([!+[]+!+[]+!+[]+!+[]]+[+!+[]]),+([!+[
]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]),+([!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+
[!+[]+!+[]]),+([!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[
]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]),+([+!+[]]+[+!+[]]+[+!+[]]),+([+!
+[]]+[+!+[]]+[+[]]),+([+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]),+([+!
+[]]+[+!+[]]+[+!+[]]),+([+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+
[]+!+[]]),+([+!+[]]+[+[]]+[+!+[]]),+([!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!
+[]+!+[]+!+[]+!+[]]),+([+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[
]+!+[]]),+([+!+[]]+[+!+[]]+[+!+[]]),+([+!+[]]+[+[]]+[!+[]+!+[]+!+[]]),+
([!+[]+!+[]+!+[]+!+[]]+[+[]]),+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!
+[]+!+[]+!+[]+!+[]+!+[]]),+([!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+
!+[]]),+([+!+[]]+[+[]]+[+!+[]]),+([+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+
[]+!+[]+!+[]+!+[]]),+([+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
+!+[]]),+([+!+[]]+[+!+[]]+[+!+[]]),+([!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!
+[]+!+[]]),+([!+[]+!+[]+!+[]]+[!+[]+!+[]]),+([!+[]+!+[]+!+[]+!+[]+!+[]+
!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]),+([+!+[]]+[+!+[]]
+[+!+[]]),+([+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]),+([+!+[]]+[+[]]+[!+[
]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]),+([+!+[]]+[+[]]+[+[]]),+([!+[]+!
+[]+!+[]]+[!+[]+!+[]+!+[]]),+([!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[
]+!+[]+!+[]+!+[]+!+[]]),+([!+[]+!+[]+!+[]+!+[]]+[+!+[]])]
/* map */[+(([!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[
]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+
[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+)[v[+!+[]]]([!+[]+!+
[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+)]
(_=>v[+!+[]](_))
/* join */[+(([!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+[!
+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]+[!
+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+)[v[+!+[]]]([!+[]+!+[]+!+[
]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+)]
([]+[])
```
何をしているかというと、
`"()=>console.log('Hello, World!')"`のそれぞれの文字コードが入った配列を用意して、
それぞれ`String.fromCharCode`で文字に変換して`join`でつなげているだけです。

ちなみに、`'eval'`は、

```javascript:'eval'
 ([]+!+[])[!+[]+!+[]+!+[]]
+v[+!+[]](+([+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))
+([]+![])[+!+[]]
+([]+![])[!+[]+!+[]]
```
です。
めでたしめでたし。

で終わってもいいんですが、
いろいろと問題があるのでそういうわけにもいきません。

が、長くなってきたせいか、変なコード書いたせいか、
プレビュー画面がおかしくなってきているので、
今日のとこはこのくらいにしておきます。

続きはそのうち書きます。
[書きました](https://qiita.com/po_tau_feu/items/ad0569584ed53b7afd77)（2018-10-29　追記）。


[^1]: こんなことはしないようにしましょう。
[^2]: 多分正しくありません。