Code Fix

初級

"合計: " + a + b が期待した数値の合計にならない理由

文字列と数値を+で連続してつなげると、最初の+で文字列に変換されてしまい、それ以降の+はすべて文字列連結として扱われます。数値同士を先に計算したい場合は括弧で明示する必要があります。

なぜエラーが出ないのか

出力: Total: 53
(エラーなし)
JavaScriptは何も報告しません。文法として正しいためです
出力: Total: 53
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  const price = 5;
 2  const qty = 3;
 3  console.log("Total: " + price + qty  );
                                  ^
出力: Total: 53期待: Total: 8 (エラーにはなりません)

"Total: " + price + qtyは左から評価されるため、文字列と結合した時点で残りも文字列連結になります。括弧で数値の計算を先に済ませる必要があります。

直し方: price + qty を (price + qty) にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  const a = 7;
 2  const b = 2;
 3  console.log("Sum: " + a + b  );
                             ^
出力: Sum: 72期待: Sum: 9 (エラーにはなりません)

括弧が無いと"Sum: " + aの時点で文字列になり、続くbもそのまま連結されます。

直し方: a + b を (a + b) にします。

この問題を解いてみる →

パターン3

 1  const x = 9;
 2  const y = 4;
 3  console.log("Combined: " + x + y  );
                                  ^
出力: Combined: 94期待: Combined: 13 (エラーにはなりません)

数値同士を先に計算してから文字列と結合したい場合は、括弧で優先順位を明示します。

直し方: x + y を (x + y) にします。

この問題を解いてみる →

パターン4

 1  const apples = 3;
 2  const oranges = 5;
 3  console.log("Fruits: " + apples + oranges  );
                                      ^
出力: Fruits: 35期待: Fruits: 8 (エラーにはなりません)

文字列と足す前に括弧で数値の計算を済ませないと、左から順に文字列連結されてしまいます。

直し方: apples + oranges を (apples + oranges) にします。

この問題を解いてみる →

パターン5

 1  const hours = 8;
 2  const minutes = 15;
 3  console.log("Time: " + hours + minutes  );
                                   ^
出力: Time: 815期待: Time: 23 (エラーにはなりません)

時間と分を足し合わせたいだけでも、括弧が無いと数値のまま計算されません。

直し方: hours + minutes を (hours + minutes) にします。

この問題を解いてみる →

よくある誤解

「+が並んでいれば数値同士は先に足し算されるはず」という思い込みは誤りです。+演算子は左から順に評価されるため、一度文字列と結合された時点で残りもすべて文字列連結になります。

実務での勘所

この種の事故を避ける実務上のテクニックとして、単項プラス(+a)という書き方があります。+aは「aを数値に変換する」という意味の演算子で、Number(a)を短く書いたものです。"合計: " + (+a + +b)のようにすれば、文字列に変換される前に確実に数値として足し算されます。読み慣れないと記号が重なって見えますが、JavaScriptのコードでは頻出するイディオムなので、+が2つ並んでいたら「型変換してから計算している」と読めるようにしておくと役立ちます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)