文法の区切り記号がおかしいときのエラーです。カッコ・カンマの過不足が主な原因です。How to fix "SyntaxError: Unexpected token": 示された位置の直前にある閉じ忘れ・余分なカンマ・全角文字を探します。下のチェッカーにコードを貼れば原因のヒントが即表示されます。
JavaScriptを貼ると、ブラウザのJSエンジンが構文だけをチェックしてエラー内容と原因のヒントを表示します(コードは実行されず、送信もされません)。
const nums = [1, 2, 3,];
const total = nums.reduce((a, b) => a + b);
console.log(total);;)
const nums = [1, 2, 3];
const total = nums.reduce((a, b) => a + b, 0);
console.log(total);
▶ 修正済みコードを実行エディタで開く
エラーで示された記号の直前を疑います。カッコの対応が取れているか、余分な)や;が無いかを確認しましょう。エディタの括弧ハイライトが役立ちます。
同じSyntaxErrorでも、後ろに続く文言で原因はほぼ特定できます。まず自分のメッセージを探してください。
| メッセージ | いちばん多い原因 |
|---|---|
Unexpected token ')' / '}' / ']' | 閉じカッコが余っている、または直前でカンマ・演算子が抜けている |
Unexpected token '<' | JSのつもりでHTMLを読み込んでいる(404ページやエラーページのHTMLが返っている) |
Unexpected end of input | 閉じカッコ・閉じ波カッコが足りない(ファイルが途中で終わっている扱い) |
Invalid or unexpected token | 全角スペース・全角引用符・BOM・文字列の閉じ忘れなど「文字そのもの」が不正 |
Unexpected token 'export' / 'import' | ESモジュールを通常スクリプトとして読み込んでいる |
Unexpected token o in JSON at position 1 | JSON.parse()にオブジェクトや非JSON文字列を渡している |
Unexpected token ':' | オブジェクトリテラルを式の位置以外で書いている/JSONをJSとして貼り付けている |
Uncaught SyntaxError: Invalid or unexpected tokenはUnexpected tokenとは別物で、「JavaScriptとして解釈できない文字が混ざっている」ことを示します。カッコの数は合っているのに直らない場合はこちらを疑ってください。
“ ” ‘ ’ — ブログやWordからコピペしたコードで発生"で始めた文字列を閉じずに改行している"C:\tmp"のようにエスケープするconst name = "progo"; // ← = の前が全角スペース
const msg = “Hello”; // ← 引用符が全角
console.log(name, msg);
OK
const name = "progo";
const msg = "Hello";
console.log(name, msg);
エディタで「空白文字を表示」をONにすると全角スペースが可視化され、一目で見つかります。
<が出たときはコードではなく読み込み側の問題です。ブラウザの開発者ツール(Networkタブ)で該当の.jsのレスポンスを見ると、中身がHTMLになっているはずです。
<script src>のパスが違い、サーバーが404ページのHTMLを返しているindex.htmlに吸われているfetch()の結果をres.json()したが、APIがエラーHTMLを返している(この場合はUnexpected token '<', "<!DOCTYPE "... is not valid JSON)APIレスポンスはres.json()の前にres.okとContent-Typeを確認するのが安全です。
const res = await fetch("/api/users");
if (!res.ok) throw new Error("HTTP " + res.status);
const ct = res.headers.get("content-type") || "";
if (!ct.includes("application/json")) {
const text = await res.text();
throw new Error("JSONではありません: " + text.slice(0, 80));
}
const data = await res.json();
console.log(data);
SyntaxError: Unexpected end of inputは「まだ閉じていないのにファイルが終わった」という意味です。足りないケースなので、Unexpected tokenとは逆方向に探します。
function・if・forの}の閉じ忘れ})を}だけで終えている/*を閉じておらず、以降が全部コメント扱いになっているJSON.parse()に途中で切れたJSON文字列を渡している(Unexpected end of JSON input)エディタで開き波カッコにカーソルを置くと対応する閉じカッコがハイライトされます。ハイライトされない=そこが未対応です。整形(Prettier / VS CodeのShift+Alt+F)をかけると、インデントが崩れた位置が不足箇所の目印になります。
import・exportはESモジュールでのみ使えます。通常スクリプトとして読み込むと構文エラーになります。
<script type="module" src="app.js"></script>にする.mjsにする、またはpackage.jsonに"type": "module"を追加するrequire()を使うとrequire is not definedになります(ReferenceErrorを参照)ファイル名:行:桁を開く。構文エラーは示された位置の1つ前に原因があることが多い下のエディタにコードを貼り付けて実行すれば、行番号付きでエラーがその場で確認できます。