本文へスキップ
totonoe.tech

難解プログラミング言語を整える

中級

JSFuckを整える

= 記号6文字「[ ] ( ) ! +」だけで JavaScript を書く言語への変換器

① 変換したい文字列・コードを入れる

ふつうの文字列でも、JSのコード片でも構いません。「実行可能な形にする」を選ぶと、入力をコードとして実行する式に変換します(このページでは実行しません)。

元のテキスト 入力するそばから変換(送信ゼロ)
0 文字

英大文字・記号・日本語・絵文字は「復元用の仕掛け」を毎回埋め込むため、1文字ごとに数千文字ふくらみます。長い入力ほど重くなるので、まずは短い文字列で試すのがおすすめです。

② 変換結果

[ ] ( ) ! + の6文字だけで構成されています。

JSFuck式

③ 文字数の比較

JSFuckは種類を6文字に絞る代わりに、長さが大きく膨張します。

元の文字数

0

変換後の文字数

0

倍率

0倍

④ 部品の内訳(1文字ずつ、こう作る)

先頭最大40文字ぶんの内訳です(それ以降は省略)。

文字 部品 式(先頭のみ表示) 文字数

なぜ6文字だけで動くのか・4つ

JavaScript の「なんでも変換しちゃう」性質を逆手に取る。

  1. 1

    配列と論理値だけで false / true / 0 / 1 が作れる

    空配列 [] は「!」を付けると false、2回付けると true になります (JavaScriptは空配列を「真の値」とみなすため、![] は false)。 さらに単項の + を付けると数値に変換され、 +[] は 0、 +!![] は 1 になります。

  2. 2

    論理値や配列に「+ []」を足すと、文字列になる

    ![]+[] は文字列 "false"!![]+[]"true"[][[]]+[]"undefined" になります。 こうして「文字を含む文字列」を、記号だけの式から手に入れます。

  3. 3

    文字列は配列のように添字で1文字ずつ取り出せる

    "false"[1] は文字 "a"。添字の 1 も①の方法で作れるので、 (![]+[])[+!![]] という式だけで "a" が手に入ります。この表の「direct」がこの方式です。

  4. 4

    それでも無い文字は、Function経由で"復元"する

    「false」「true」「undefined」「NaN」 の中に出てこない文字(大文字の多くや記号・日本語・絵文字)は、 いったん []["filter"]["constructor"] (= Function)にたどり着き、 「return"あ"」のような 文字コード指定(のコード)を含む文字列を 1個のコードとして組み立てて実行させ、その文字を復元します。この表の「escape」がこの方式で、 毎回「Functionにたどり着くための部品一式」を埋め込むぶん一気に長くなります (JSFuckには変数が無く、使い回しができないため)。

送信ゼロ・実行ゼロ

変換はすべてこの端末の中だけで完結します(送信ゼロ)。そして このページでは、変換した式を一切実行しません(実行ゼロ)。 「実行可能な形にする」を選んでも、生成されるのは「実行する式」という文字列だけで、 このページ自身がそれを走らせることはありません。本番のセキュリティポリシー(CSP)にも コード文字列を実行する仕組み(eval等)を許可する設定は入っていません。

このツールについて

JSFuck は `[ ] ( ) ! +` の6文字だけで書く JavaScript のエソラング(2012年 aemkei 作)。このツールは文字列やコードをJSFuck式へ変換するだけで、変換した式をこのページ上で実行することは一切ありません(送信ゼロ・実行ゼロ)。

任意の文字列やコードを [ ] ( ) ! + の6文字だけの式に変換。文字数の比較部品の内訳("a" はこう作る…)つき。このページでは変換した式を実行しません

主な機能

  • [ ] ( ) ! + の6文字だけへ変換
  • 「実行可能な形にする」で実行用の式にも変換
  • 元/変換後の文字数比較と倍率表示
  • 文字ごとの部品内訳表(direct/digit/escape)
  • 型変換の仕組みの解説
  • 実行ゼロ・送信ゼロ

よくある質問

Q. JSFuck とは何ですか?

A. [ ] ( ) ! + の6種類の記号だけで任意の JavaScript を表現する言語です(2012年・Martin Kleppe)。JavaScript が配列や論理値を数値・文字列へ自動で変換する性質を利用しています。

Q. なぜ変換すると文字数が何千倍にも増えるのですか?

A. JSFuck には変数が無く、1文字作るたびに元になる仕組み(false/true の文字列化や Function への経路)を毎回まるごと埋め込む必要があるためです。特に大文字・記号・日本語は1文字で数千文字になります。

Q. このページで変換した式は実行されますか?

A. いいえ。変換はブラウザ内で完結し(送信ゼロ)、生成した式をこのページが実行することはありません(実行ゼロ)。「実行可能な形にする」を選んでも、できるのは「実行する式」という文字列だけです。

Q. 「実行可能な形にする」を選ぶと何が変わりますか?

A. 入力をそのまま文字列として表す式ではなく、[]["filter"]["constructor"](コード)() という「入力をコードとして実行する式」に変換します。実際に走らせるかどうかは、その式を受け取った側の判断です。

Q. 内訳表の direct・digit・escape の違いは?

A. direct は 「false」「true」「undefined」「NaN」 の文字列から直接1文字を取り出す方式、digit は 0〜9 の数値式、escape はそれ以外の文字を Function 経由で復元する方式です。escape は1文字で数千文字になります。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

KOINOBORI ECOSYSTEM

私たちが運営するサイト