文字列同士の + が連結になる理由
数字だけの文字列同士でも、+演算子は数値としての加算ではなく文字列としての連結を行います。数値として計算したい場合はNumber()などで明示的に変換する必要があります。
なぜエラーが出ないのか
出力: 103
(エラーなし)- JavaScriptは何も報告しません。文法として正しいためです
出力: 103- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 const a = "10"; 2 const b = "3"; 3 console.log(a + b ); ^
aもbも文字列なので、+はまず文字列連結として動作します。数値として合計したい場合はNumber()で変換します。
直し方: a + b を Number(a) + Number(b) にします。
パターン2
1 const x = "20"; 2 const y = "5"; 3 console.log(x + y ); ^
数字だけの文字列でも+は連結として扱われます。Number()での変換が必要です。
直し方: x + y を Number(x) + Number(y) にします。
パターン3
1 const m = "100"; 2 const n = "1"; 3 console.log(m + n ); ^
見た目が数字でも文字列型のままでは連結されます。合計を得るには明示的な変換が必要です。
直し方: m + n を Number(m) + Number(n) にします。
パターン4
1 const p = "7"; 2 const q = "8"; 3 console.log(p + q ); ^
どちらも文字列型のままなので、+は連結として動作します。
直し方: p + q を Number(p) + Number(q) にします。
パターン5
1 const first = "50"; 2 const second = "25"; 3 console.log(first + second ); ^
数字だけの文字列同士でも、変換しない限り+は足し算になりません。
直し方: first + second を Number(first) + Number(second) にします。
よくある誤解
「数字に見える文字列なら自動で数値として計算されるはず」という思い込みは誤りです。+は片方でも文字列があれば文字列連結を優先するため、両方が数字だけの文字列でも連結されます。
実務での勘所
紛らわしいのは+だけです。-や*、/は文字列連結という意味を持たないため、両辺を強制的に数値に変換してから計算します。"5" - "2"は3、"5" * "2"は10になり、変換できない文字列を使うと"5" - "abc"のようにNaNになります。+だけが「文字列連結」という別の意味を兼ねているせいで両辺の型によって挙動が変わるのであって、他の算術演算子は常に数値として計算するという一貫した挙動です。