JSF**kのカラクリ

# JSF**kとは
JSF**kとはJSFuckのことであり、Javascriptで以下の文字だけでプログラミングするJavascriptの縛りプレイのようなものです。
```js
![]+()
```
# JSF**kの基本
## 数の生成
まず、空の配列をNOTするとfalseになります。
```js
![] //falseになる
```
そして、boolean同士を足すと数字になります。このときtrueは1、falseは0として演算されます。
```js
!![]+!![] //2になる
```
あと、最初に+でもいけます。
```js
+!![] //1になる
```
## 文字の生成
文字列を生成するには、以下の性質が必要です。
```js
true + [] //"true"になる
false + []//"false"になる
```
そう、なんらかのオブジェクトに配列を足すと文字列になるのです。
## コードの実行
### コード実行のカラクリ
これである程度コードは作れますがこれでは何もできません。
が、なんとこのようにして文字列をJavascriptコードとして実行できます。
```js
[]["at"]["constructor"]("任意のJSコード")()
```
### `"at"`と`"constructor"`を作ろう
しかし、`"at"`と`"constructor"`のs,t,r,uはtrueとfalseから生成できますがc,o,nはありません。どうしたものか。
なんと、最初の文字生成は関数にも使えます。`[]["at"]`は関数なので、このようにしましょう。
```js
[][(![]+[])[+!![]]+(!![]+[])[+![]]]+[]
//"function at() { [native code] }"になる
```
これでconstructorは作れます！
```js
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+ //c
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+ //o
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+ //n
(![]+[])[!![]+!![]+!![]]+ //s
(!![]+[])[+![]]+ //t
(!![]+[])[+!![]]+ //r
(!![]+[])[!![]+!![]]+ //u
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+ //c
(!![]+[])[+![]]+ //t
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+ //o
(!![]+[])[+!![]] //r
```
では`[]["at"]["constructor"]`を書いてみましょう！
```js
[][(![]+[])[+!![]]+(!![]+[])[+![]]][([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+(!![]+[])[!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]]
```
ではalert()でも実行しますか。
```js
[][(![]+[])[+!![]]+(!![]+[])[+![]]][([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+(!![]+[])[!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]] //[]["at"]["constructor"]
(
(![]+[])[+!![]]+ //a
(![]+[])[!![]+!![]]+ //l
(![]+[])[!![]+!![]+!![]+!![]]+ //e
(!![]+[])[+!![]]+ //r
(!![]+[])[+![]]+ //t
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(+!![]))]+ //(
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(!![]+!![]))] //)
)()
```
ではコメントを消して一行に
```js
[][(![]+[])[+!![]]+(!![]+[])[+![]]][([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+(!![]+[])[!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]]((![]+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(+!![]))]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(!![]+!![]))])()
```
# 終わりに
JSF**は、文字列をJSとして実行する関数にJSの文字列を渡すことで動かすことができるのである。