本文へスキップ
totonoe.tech

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

中級

JavaScript を整える

= 「1」+ 1 が "11" になる——実行して初めて分かる間違いを、ブラウザ内で安全に試す

サンプルコード(クリックでエディタに挿入)

JAVASCRIPT EDITOR QuickJS 0.31.0 (WASM)

OUTPUT

JavaScript コードを書いて「実行」を押すと、ここに console 出力と最後の式の値が出ます。

JavaScript は「実行するまで」間違いが分からない。

型注釈が無いので、書いた瞬間には何もエラーが出ません。上のサンプルボタン ②〜⑤ が、その代表例です。

  • 変数と型 — 暗黙の型変換

    "1" + 1 は文字列連結になり "11"。 でも "1" - 1 は数値に変換されて 0。演算子によって挙動が変わることは、実行して初めて確認できます。

  • 存在しないプロパティ — 「undefined」が静かに広がる

    タイプミスしたプロパティ名は、エラーにならず 「undefined」 を返すだけ。そのまま計算やテンプレートに混ざり、さらにそれを掘り下げようとした瞬間に TypeError が起きます。

  • 引数の数の違い — 足りない分は「undefined」

    関数に渡す引数が足りなくても呼び出しエラーにはならず、足りない仮引数は 「undefined」 になって処理が進みます。呼び出し側の個数チェックは実行時にはありません。

  • null の扱い — typeof null は "object"

    typeof null は仕様上のバグで "object" になります。null のプロパティに触れると、その場で例外が発生します。

JavaScript と TypeScript の違い

上の4つの間違いは、TypeScript で書くと「実行する前」「書いた時点」で赤い波線として指摘されます。

観点 JavaScript TypeScript
型の指定 無い(実行時に値を見て決まる) 書ける(: string 等の型注釈)
間違いに気づく時点 実行した時(その行を通ったとき) 書いた時(エディタ上で赤い波線)
実行の仕組み そのまま実行される 型注釈を取り除いた JavaScript に変換してから実行(変換自体は実行時に何も足さない)
学習コスト 低い(すぐ書き始められる) やや高い(型の書き方を覚える分)
向いている場面 小さなスクリプト・すぐ試したいコード 複数人・長期運用するコード(間違いを早期発見したい場面)

同じサンプルコードを TypeScript で書くとどうなるか、 /typescript/ の Playground で確認できます。同じ間違いが「実行する前」に赤くなる様子を見比べてみてください。

このページについて

ここで動くのは QuickJS(WASM) で動く練習用の素の JavaScript です。 ブラウザ本体のエンジンではなく別のエンジンで動かしているため、DOM・fetch・setTimeout は使えません。 無限ループを書いても一定時間で処理を打ち切るので、ページが固まることはありません。

🌐 このページを開いただけでは外部通信は発生しませんが、「実行」を押した最初の1回だけ、 JavaScript の実行環境(QuickJS 0.31.0)を配信元の cdn.jsdelivr.net から取得します(初回のみ約1MB)。 これはプログラムを受け取るだけの通信で、あなたが書いたコードや実行結果が送られることはありません。 ただし通信である以上、配信元にはお使いの回線の IP アドレスが見えます。 「入力は端末から出さない」という当サイトの原則に関わる点なので、隠さずに書いておきます。 送信ゼロ(書いたコードと実行結果はどこにも送信されません)。

このツールについて

JavaScript には型注釈がありません。だから間違いの多くは「書いた時点」ではなく「実行した時点」で初めて分かります。ここではその感覚を、実際に手を動かして体験できます。

ブラウザ内 QuickJS(WASM) で JavaScript を実行。「1」+ 1 = "11"存在しないプロパティ引数不足null の扱いなど「実行して初めて分かる間違い」を体験。同じ題材を TypeScript で書いた /typescript/ と見比べられます。

主な機能

  • 7サンプル(Hello World・変数と型・存在しないプロパティ・引数の数違い・null の扱い・配列 map/filter/reduce・クラス)
  • 「実行するまで分からない」を4題材で解説・JS と TS の違い表
  • /typescript/ の同じ題材ページへの導線
  • console 出力・最後の式の値・エラー・所要時間を表示、無限ループは2秒で停止
  • CodeMirror 6 シンタックスハイライト・Ctrl/⌘+Enter で実行
  • DOM・fetch・setTimeout は無い練習用の素の JavaScript・処理系は cdn.jsdelivr.net から初回のみ・送信ゼロ

よくある質問

Q. 入力した JavaScript コードはサーバーに送られますか?

A. 送られません。実行環境(QuickJS・WASM)がブラウザ内に読み込まれ、コードの実行も出力もすべて端末内で完結します。外へ出る通信は実行環境のダウンロードだけです。

Q. なぜ「1」+ 1 が "11" になるのですか?

A. JavaScript の + 演算子は、片方が文字列なら「連結」として扱う仕様だからです。数値の足し算のつもりで書いたコードが、文字列が混ざった瞬間に挙動を変えます。実行するまで気づけない典型例です。

Q. DOM 操作や fetch は使えますか?

A. 使えません。ここで動くのはブラウザ本体のエンジンではなく、練習用に独立させた QuickJS(WASM)です。ページの見た目を変えたり外部と通信したりする機能は、送信ゼロを保つために持たせていません。

Q. 無限ループを書いたらどうなりますか?

A. 2秒で処理を打ち切り、「制限時間で停止しました」と表示します。ブラウザのタブが固まることはありません。

Q. JavaScript と TypeScript の違いを知りたい場合は?

A. 同じ4つの間違い(型・プロパティ・引数・null)を TypeScript で書いた /typescript/ で試せます。TypeScript では同じコードが実行前の型検査で指摘される様子を見比べられます。

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

続けて整える

KOINOBORI ECOSYSTEM

私たちが運営するサイト