---
title: 記号だけで書けちゃうJavaScript
tags: 
author: [murasuke](https://docswell.com/user/4962106)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/LJLMMNPXER.jpg?width=480
description: 記号だけで書けちゃうJavaScript by murasuke
published: May 01, 26
canonical: https://docswell.com/s/4962106/ZMQL1X-2026-05-01-080559
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/LJLMMNPXER.jpg)

記号だけで書けちゃうJavaScript
2025/08/04 俺たちの勉強会 #3
#orestudy


# Page. 2

![Page Image](https://bcdn.docswell.com/page/47MYYX437W.jpg)

自己紹介：murasuke
・株式会社 ツールラボ 開発部
３年ほど前に転職して、勉強会に出る時間ができました
・前回、俺たちの勉強会#2 で「人生初のLT」をやりました👏
・6月の社員旅行(in 熱海)で
「呑みながらLT会」やりました
（盛り上がったので多分来年もやります！）


# Page. 3

![Page Image](https://bcdn.docswell.com/page/P7R99NWRE9.jpg)

これはJavaScriptの式です。(ブラウザで)実行できます
_=
({}+[])[-~-~-~-~-~[]]+({}+[])[-~[]]+([][&#039;&#039;]+[])[-~[]]+(![]+[])[-~-~-~[]]+(!![]+[])[+[]]
+(!![]+[])[-~[]]+([][&#039;&#039;]+[])[+[]]+({}+[])[-~-~-~-~-~[]]+(!![]+[])[+[]]+({}+[])[-~[]]+(!![
]+[])[-~[]];__=
(!![]+[])[-~[]]+({}+[])[-~-~-~-~[]]+(!![]+[])[+[]]+([][&#039;&#039;]+[])[+[]]+(!![]+[])[-~[]]+([][&#039;&#039;]+
[])[-~[]];[][_][_]((![]+[])[-~[]]+(![]+[])[-~-~[]]+(!![] + [])[-~-~-~[]]+(!![] +
[])[-~[]]+(!![] + [])[+[]]+&#039;(&#039;+&quot;&#039;&quot;+[][_][_](__+&#039;
&quot;\\&#039;+([][&#039;&#039;]+[])[+[]]+(+[])+(+[])+(-~-~[]&lt;&lt;-~[])+(-~-~[]&lt;&lt;-~-~[])+&#039;&quot;&#039;)()+(!![] +
[])[-~-~-~[]]+(![]+[])[-~-~[]]+(![]+[])[-~-~[]]+({} + [])[-~[]]+&#039;,&#039;+[][_][_](__+&#039;
&quot;\\&#039;+([][&#039;&#039;]+[])[+[]]+(+[])+(+[])+(-~-~-~-~-~-~-~[])+(-~-~-~-~-~-~-~[])+&#039;&quot;&#039;)()+(
{} + [])[-~[]]+(!![] + [])[-~[]]+(![]+[])[-~-~[]]+([][[]] + [])[-~-~[]]+&#039;!&#039;+&quot;&#039;&quot;+&#039;)&#039;)()


# Page. 4

![Page Image](https://bcdn.docswell.com/page/PJXQQNPY7X.jpg)

ブラウザのコンソールで実行できます！
ちゃんと？「 alert(’Hello, world!’)」が実行できました


# Page. 5

![Page Image](https://bcdn.docswell.com/page/3JK99ND4JD.jpg)

なぜ [] や ![]や[_] だけでコードが書けるのか
JavaScriptは
●
「記号」と「文字列」のみで(キーワードを使わずに)
「実行」する方法があります
●
「任意の文字 」は「記号」の組み合わせで作ることができます
⇒ つまり「 スクリプト」から「文字」を排除することが可能です
1. 実行する処理を「記号」＋「文字列」で表現するテクニック
2. 「文字列」を「記号」に置き換えるテクニック
について解説します


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LE3WWVRDE5.jpg)

実行する処理を「記号」＋「文字列」で表現する
「Functionコンストラクタ」を使います (eval()ではなく )
new Function(&#039;実行する処理&#039;)(); // newはJSの仕様で省略可
空配列のリテラルからプロトタイプチェーンをたどることで取得できます
⇐ Arrayのコンストラクタ
⇐ これがFunctionコンストラクタ
任意の文字列の実行を行う処理は、このように書くことができます
[].constructor.constructor(&#039;実行する処理&#039;)


# Page. 7

![Page Image](https://bcdn.docswell.com/page/8EDKK8Y27G.jpg)

実行する処理を「記号」＋「文字列」で表現する
● 「プロパティ」は「配列のアクセス」に書き換えることができます
[][‘constructor’][‘constructor’](&#039;実行する処理&#039;)()
(任意の文字列を実行する処理を、キーワードを使わずに)
「文字列」と「記号」で表現することができました
●
次は「文字列」を「記号」で表す方法を解説します！


# Page. 8

![Page Image](https://bcdn.docswell.com/page/V7PKK86LJ8.jpg)

「文字列」を「記号」に置き換えるテクニック
「記号」から「文字」の作り方を順に見ていきます
1. 記号の組み合わせで「 数字」を作る
2. 評価結果 (例:false)を文字列化して「 文字」を切り出す
3. 文字コードから (なんとかして )「文字」を生成する


# Page. 9

![Page Image](https://bcdn.docswell.com/page/2JVVVN36JQ.jpg)

記号の組み合わせで「数字」を作る
評価結果が0になる式を作る
（空配列に+をつけることで
数値(0)として評価される）
&gt; +[]
0
0の補数を取ることで-1を作る
&gt; ~+[]
-1
マイナス符号を付けて1にする
&gt; -~+[]
1
1の補数をとると「-2」
繰り返して大きな数字を作る
&gt; ~-~+[]
-2
シフト演算で大きな数を作る
&gt; -~-~[]&lt;&lt;-~-~[]
8


# Page. 10

![Page Image](https://bcdn.docswell.com/page/5EGLLK32JL.jpg)

評価結果(例:false)を文字列化して「文字」を切り出す
評価結果がfalseになる式を作る
&gt; ![]
false
評価結果を文字列化(+[])する
&gt; ![]+[]
’false’
評価結果から1文字取り出す
&gt; (![]+[])[0]
’f’
0になる式(+[])と合わせる
&gt; (![]+[])[+[]]
’f’
ここまでで、「‘f’, ‘a’, ‘l’, ‘s’, ‘e’」 の5文字を作ることができました


# Page. 11

![Page Image](https://bcdn.docswell.com/page/4JQYYN597P.jpg)

評価結果(例:false)を文字列化して「文字」を切り出す
評価結果から文字を切り出す際に使える式の例
![]+[]; // &#039;false&#039;
!![]+[]; // &#039;true&#039;
{}+[]; // &#039;[object Object]&#039;
[][[]]+[]; // &#039;undefined&#039;
-~[]/[]+[]; // &#039;Infinity&#039;
+{}+[]; // &#039;NaN&#039;
※残念ながら、すべてのアルファベットを作ることはできません


# Page. 12

![Page Image](https://bcdn.docswell.com/page/K74WWGVRE1.jpg)

文字コードから(なんとかして)「文字」を生成する
前ページで作れない文字は、文字エスケープ(\uHHHH)から作ります
&gt; Function(&#039;return &quot;\u0041&quot;&#039;)()
&#039;A&#039;
Functionコンストラクタは、既出なので置き換えます
&gt; [][&#039;constructor&#039;][&#039;constructor&#039;](&#039;return &quot;\u0041&quot;&#039;)()
&#039;A&#039;
&#039;constructor&#039;、&#039;return&#039;、&#039;\u0041&#039;は、前ページで作った文字から作れるので・・・
&gt; ({}+[])[-~-~-~-~-~[]]+({}+[])[-~[]]+([][&#039;&#039;]+[])[-~[]]+(![]+[])[-~-~-~[]]+(!![]+[])[+[]]+(!![]+[])[-~[]]
+([][&#039;&#039;]+[])[+[]]+({}+[])[-~-~-~-~-~[]]+(!![]+[])[+[]]+({}+[])[-~[]]+(!![]+[])[-~[]]
&#039;constructor&#039;
&gt; (!![]+[])[-~[]]+({}+[])[-~-~-~-~[]]+(!![]+[])[+[]]+([][&#039;&#039;]+[])[+[]]+(!![]+[])[-~[]]+([][&#039;&#039;]+[])[-~[]]
&#039;return&#039;
&gt; &#039; &quot;\\&#039;+([][&#039;&#039;]+[])[+[]]+(+[])+(+[])+(-~-~[]&lt;&lt;-~[])+(-~[])+&#039;&quot;&#039;
&#039; &quot;\\u0041&quot;&#039;


# Page. 13

![Page Image](https://bcdn.docswell.com/page/LJ1YYD3VEG.jpg)

文字コードから(なんとかして)「文字」を生成する
全てを組み合わせることで、(なんとか)「A」を作ることができました！
&gt;
[][(({}+[])[-~-~-~-~-~[]]+({}+[])[-~[]]+([][&#039;&#039;]+[])[-~[]]+(![]+[])[-~-~-~[]]+(!![]+[])[+[]]+(!
![]+[])[-~[]]+([][&#039;&#039;]+[])[+[]]+({}+[])[-~-~-~-~-~[]]+(!![]+[])[+[]]+({}+[])[-~[]]+(!![]+[])[-~[
]])][(({}+[])[-~-~-~-~-~[]]+({}+[])[-~[]]+([][&#039;&#039;]+[])[-~[]]+(![]+[])[-~-~-~[]]+(!![]+[])[+[]]+
(!![]+[])[-~[]]+([][&#039;&#039;]+[])[+[]]+({}+[])[-~-~-~-~-~[]]+(!![]+[])[+[]]+({}+[])[-~[]]+(!![]+[])[~[]])]((!![]+[])[-~[]]+({}+[])[-~-~-~-~[]]+(!![]+[])[+[]]+([][&#039;&#039;]+[])[+[]]+(!![]+[])[-~[]]+([][&#039;&#039;
]+[])[-~[]]+&#039; &quot;\\&#039;+([][&#039;&#039;]+[])[+[]]+(+[])+(+[])+(-~-~[]&lt;&lt;-~[])+(-~[])+&#039;&quot;&#039;)()
&#039;A&#039;


# Page. 14

![Page Image](https://bcdn.docswell.com/page/GJWGGYP372.jpg)

まとめ
●
Functionコンストラクタで (キーワードを使わず )「任意の js文字」が実行できる
&gt; [][&#039;constructor&#039;][&#039;constructor&#039;](&#039;任意のjs文字列&#039;)()
●
Functionコンストラクタの「 &#039;constructor&#039;」を「記号」に置き換えることができる
&gt; [][({}+[])[-~-~-~-~-~[]]+({}+[])[-~[]]+([][&#039;&#039;]+[])[-~[]]+(![]+[])[-~-~-~[]]+(!![]+[])[+[]]+(!![]+[])[-~[]]
+([][&#039;&#039;]+[])[+[]]+({}+[])[-~-~-~-~-~[]]+(!![]+[])[+[]]+({}+[])[-~[]]+(!![]+[])[-~[]]][({}+[])[-~-~-~-~-~[]]+({}+[])[-~[]]+([][&#039;&#039;]+[])[-~[]]+(![]+[])[-~-~-~[]]+(
!![]+[])[+[]]+(!![]+[])[-~[]]+([][&#039;&#039;]+[])[+[]]+({}+[])[-~-~-~-~-~[]]+(!![]+[])[+[]]+({}+[])[-~[]]+(!![]+[])[-~[]]](&#039;任意のjs文字列&#039;)()
●
「`任意のjs文字列`」も「記号化が可能」（置き換えるだけ）
これで明日から「記号」で書いて同僚に迷惑をかけることができますね！
変換プログラム：https://github.com/murasuke/js-obfuscator


