誕生日を祝うとは()



[JS記号プログラミング入門](https://qiita.com/acid_chicken/items/eeb0b42a1ecbba0c49e3)で遊びました...(**狂気**)。

**想定**

```javascript:happybirthday.js
alert('Happy,Birthday!');
```

**実装(結論)**

```javascript:symbol.js
(+[])[({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]][({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]]((!!{}+"")[-~[]]+(!!{}+"")[-~-~-~[]]+(!!{}+"")[+[]]+(!!{}+"")[-~-~[]]+(!!{}+"")[-~[]]+({}.$+"")[-~[]]+"\"\\"+-~[]+-~[]+-[]+(!{}+'')[-~[]]+(/ /[({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]]+[])[-~-~-~-~-~-~-~-~-~-~-~-~-~-~[]]+(/ /[({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]]+[])[-~-~-~-~-~-~-~-~-~-~-~-~-~-~[]]+(-~[]/[]+[])[-~-~-~-~-~-~-~[]]+','+"\\"+-~[]+-[]+-~-~[]+(-~[]/[]+[])[-~-~-~[]]+(!![]+[])[-~[]]+(!![]+[])[+[]]+"\\"+([][[]]+[])[+[]]+-[]+-[]+-~-~-~-~-~-~[]+-~-~-~-~-~-~-~-~[]+([][[]]+[])[-~-~-~-~-~-~-~-~[]]+(![]+[])[-~[]]+(-~[]/[]+[])[-~-~-~-~-~-~-~[]]+'!'+"\"")();
```

細かいことは↑の記事を読んでください。素晴らしい記事です。

そして気づいたら、alertじゃなくてconsoleになってました。以上です。

**以下メモ欄(スクロールしても何もありません。ただのメモ書きです。)**
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />

ネーム入り実装

```javascript:happybirthday.js
(0).constructor.constructor("alert('Happy,Birthday!')")()
```

Functinオブジェクト  
当然Numberオブジェクトでなくてもできますが、どうせ全部記号に置き換わることになるので、わざわざ荊の道をいく必要はないでしょう( `({}+'')[5].constructor.constructor('alert()')()` Stringオブジェクト `c (({}+'')[5])`より生成(ただ無駄に長くなるだけ))。

```javascript:console.js
>(0)
0

>(0).constructor
ƒ Number() { [native code] }

>(0).constructor.constructor
ƒ Function() { [native code] }

>(0).constructor.constructor()
ƒ anonymous(
) {

}

>(0).constructor.constructor('alert()')
ƒ anonymous(
) {
alert()
}

>(0).constructor.constructor('alert()')()
undefined // alert()の実行
```

で得られた関数をドット記法から、ブラケット記法に変換して、全て文字列にする。

```javascript:happybirthday.js
(0)['constructor']['constructor']("alert('BB!Happy,Birthday!')")()
```



```javascript:constructor.js
// c
console.log(({}+'')[5]);
// o
console.log(({}+'')[1]);
// n
console.log(({}.$+"")[1]);
// s
console.log((!{}+'')[3]);
// t
console.log((!!{}+'')[0]);
// r
console.log((!!{}+'')[1]);
// u
console.log((!!{}+'')[2]);
// c
console.log(({}+'')[5]);
// t
console.log((!!{}+'')[0]);
// o
console.log(({}+'')[1]);
// r
console.log((!!{}+'')[1]);

// constructor
({}+'')[5]+({}+'')[1]+({}.$+"")[1]+(!{}+'')[3]+(!!{}+'')[0]+(!!{}+'')[1]+(!!{}+'')[2]+({}+'')[5]+(!!{}+'')[0]+({}+'')[1]+(!!{}+'')[1]

```

```javascript:alert.js
// a
console.log((!{}+'')[1]);
// l
console.log((!{}+'')[2]);
// e
console.log((!!{}+'')[3]);
// r
console.log((!!{}+'')[1]);
// t
console.log((!!{}+'')[0]);

// alert
console.log((!{}+'')[1]+(!{}+'')[2]+(!!{}+'')[3]+(!!{}+'')[1]+(!!{}+'')[0]);
```

`大文字`


普通に８進数で文字列を作ってもダメみたいなので、関数でreturnする

```javascript:omoji.js
// B
console.log("\102");
// H
console.log("\110");

// B
console.log((0)["constructor"]["constructor"]((!!{}+"")[1]+(!!{}+"")[3]+(!!{}+"")[0]+(!!{}+"")[2]+(!!{}+"")[1]+({}.$+"")[1]+"\""+"\\"+1+-[]+-~-~[]+"\"")());

console.log((0)["constructor"]["constructor"]((!!{}+"")[1]+(!!{}+"")[3]+(!!{}+"")[0]+(!!{}+"")[2]+(!!{}+"")[1]+({}.$+"")[1]+"\""+"\\"+1+0+2+"\"")());
```


// BB

```
$=+[];$={___:$++,__$:$++,_$_:$++,_$$:$++};($.___)["constructor"]["constructor"]((!!{}+"")[$.__$]+(!!{}+"")[$._$$]+(!!{}+"")[$.___]+(!!{}+"")[$._$_]+(!!{}+"")[$.__$]+({}.$+"")[$.__$]+"\""+"\\"+-~[]+-[]+-~-~[]+"\\"+-~[]+-[]+-~-~[]+"\"")();
```
// BB!Ha

```
$=+[];$={___:$++,__$:$++,_$_:$++,_$$:$++};($.___)["constructor"]["constructor"]((!!{}+"")[$.__$]+(!!{}+"")[$._$$]+(!!{}+"")[$.___]+(!!{}+"")[$._$_]+(!!{}+"")[$.__$]+({}.$+"")[$.__$]+"\""+   "\\"+-~[]+-[]+-~-~[]+   "\\"+-~[]+-[]+-~-~[]+   "!"+   "\\"+-~[]+-~[]+-[]+   (!{}+'')[$.__$]+"\"")();
```

// p

```
(/ /[({}+'')[5]+({}+'')[1]+({}.$+"")[1]+(!{}+'')[3]+(!!{}+'')[0]+(!!{}+'')[1]+(!!{}+'')[2]+({}+'')[5]+(!!{}+'')[0]+({}+'')[1]+(!!{}+'')[1]]+[])[14]
```

```
$=+[];$={___:$++,__$:$++,_$_:$++,_$$:$++};($.___)["constructor"]["constructor"]((!!{}+"")[$.__$]+(!!{}+"")[$._$$]+(!!{}+"")[$.___]+(!!{}+"")[$._$_]+(!!{}+"")[$.__$]+({}.$+"")[$.__$]+"\""+   "\\"+-~[]+-[]+-~-~[]+   "\\"+-~[]+-[]+-~-~[]+   "!"+   "\\"+-~[]+-~[]+-[]+   (!{}+'')[$.__$]+ (/ /[({}+'')[5]+({}+'')[1]+({}.$+"")[1]+(!{}+'')[3]+(!!{}+'')[0]+(!!{}+'')[1]+(!!{}+'')[2]+({}+'')[5]+(!!{}+'')[0]+({}+'')[1]+(!!{}+'')[1]]+[])[14]+ "\"")();
```


// コピペしやすいように(メッセージ微妙に違います)

`(+[])[({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]][({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]]((!!{}+"")[-~[]]+(!!{}+"")[-~-~-~[]]+(!!{}+"")[+[]]+(!!{}+"")[-~-~[]]+(!!{}+"")[-~[]]+({}.$+"")[-~[]]+"\""+"\\"+-~[]+-[]+-~-~[]+"\\"+-~[]+-[]+-~-~[]+"!"+"\\"+-~[]+-~[]+-[]+(!{}+'')[-~[]]+(/ /[({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]]+[])[-~-~-~-~-~-~-~-~-~-~-~-~-~-~[]]+(/ /[({}+'')[-~-~-~-~-~[]]+({}+'')[-~[]]+({}.$+"")[-~[]]+(!{}+'')[-~-~-~[]]+(!!{}+'')[+[]]+(!!{}+'')[-~[]]+(!!{}+'')[-~-~[]]+({}+'')[-~-~-~-~-~[]]+(!!{}+'')[+[]]+({}+'')[-~[]]+(!!{}+'')[-~[]]]+[])[-~-~-~-~-~-~-~-~-~-~-~-~-~-~[]]+(-~[]/[]+[])[-~-~-~-~-~-~-~[]]+','+"\\"+-~[]+-[]+-~-~[]+(-~[]/[]+[])[-~-~-~[]]+(!![]+[])[-~[]]+(!![]+[])[+[]]+"\\"+([][[]]+[])[+[]]+-[]+-[]+-~-~-~-~-~-~[]+-~-~-~-~-~-~-~-~[]+([][[]]+[])[-~-~-~-~-~-~-~-~[]]+(![]+[])[-~[]]+(-~[]/[]+[])[-~-~-~-~-~-~-~[]]+'!'+"\"")();
`
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
#終わりに

~~全然関係ないですけど、これ作ってる時に他のエンジニアの人にこれは見て楽しむものであって普通やらないからって言われましたまる~~

#参考

[記号だけのJavaScriptプログラミングの基本原理](http://perl-users.jp/articles/advent-calendar/2010/sym/3)