算術演算子とは?(なぜ仕様=ECMAScriptが大事なのか)
JavaScriptの「算術演算子」は、数値に対して四則演算などの計算をするための記号です。たとえば、+ は足し算、- は引き算のように、普段の数学と同じ感覚で使えます。
ただし、JavaScriptの演算子が「どう動くか」は、勝手に決まっているのではなく、ECMAScript(エクマスクリプト)という共通ルール(仕様)で決まっています。演算子の優先順位や、型が違うものを計算したときの扱い(後述の型変換)も、この仕様に沿っています。
ECMAScriptは定期的に更新され、2024年6月時点の最新版は ECMAScript 2024(ES15)です。+ や – といった記号自体は昔からありますが、「文字列や真偽値が混ざったときにどう扱うか」などの細かなルールは、言語の進化とともに整理・洗練されてきました。
JavaScriptはブラウザだけでなく、Node.jsによってサーバー側でも使われています。そのため算術演算子は、画面の位置計算(DOM操作・アニメーション)だけでなく、データ処理や集計などにも登場します。つまり、算術演算を理解することは、どの環境でも通用する“共通の基礎”を作ることにつながります。
加算(+):足し算だけじゃない(文字列連結と型変換が落とし穴)
加算演算子(+)は、数値同士なら普通に足し算です。
例)10 + 5 → 15
ただし JavaScript の + は、もう1つ大事な役割があります。それは「文字列をつなげる(連結する)」ことです。ここが初心者が混乱しやすいポイントです。
JavaScriptは動的型付けなので、数値と文字列が混ざっていてもエラーにならず、勝手に型を変えて処理を続けます(暗黙の型変換)。
例)
let x = ‘5’; // 文字列
let y = 3; // 数値
console.log(x + y); // ’53’
この場合、数学的には 8 を期待しがちですが、JavaScriptは「文字列として結合する」と判断して ’53’ になります。エラーにならないので、気づかないままバグになることがあります。
さらに、true + 1 のように真偽値が混ざると、true が 1 として扱われて 2 になることもあります。見た目は計算できているように見えるので、これもバグが見つかりにくい原因になります。
文字列を作る目的なら、最近のJavaScriptではテンプレートリテラル( )が読みやすくておすすめです。
ただし「数値計算」をしたいときは、扱っている値が本当に数値なのかを意識して、必要なら typeof や console.log() で確認するのが安全です。
減算(-):数値として計算しようとする(でもNaNに注意)
減算演算子(-)は、左から右を引く演算子です。
例)10 – 5 → 5
と違って、- には「文字列を連結する」という役割はありません。そのため JavaScript は、- を使うときは基本的に「数値計算をしよう」とします。
例)
’10’ – 5 → 5
(文字列 ’10’ を数値 10 に変換して計算する)
ただし、この自動変換に頼りすぎるのは危険です。数値に変換できない文字列だと NaN になります。
例)
‘apple’ – 5 → NaN
NaNが一度出ると、その後の計算も NaN だらけになって原因が追いづらくなることがあります。フォーム入力の値は文字列として取れることが多いので、DOM操作などで計算する前に「型と中身を確認する」クセが大事です。
乗算():他の言語と同じ感覚だが、型混入は要注意
乗算演算子()は掛け算です。
例)10 * 5 → 50
記号は数学の × の代わりで、ほとんどの言語と共通です。JavaScriptでも、減算と同じように「数値に変換できるなら変換して計算」します。
ただし、Node.js のようにサーバー側で大量データを扱う場面では、意図しない型が混ざると影響が大きくなります。ブラウザの小さなスクリプトよりも、暗黙の型変換が事故につながりやすいので、数値同士で計算する前提(入力チェックや型変換の明示)を意識すると安心です。
なお、べき乗(2の3乗など)には **(べき乗演算子)もありますが、まずは * を確実に使えるようになるのが先です。
除算(/):結果は小数になる(0で割るとInfinity)
除算演算子(/)は割り算です。
例)10 / 5 → 2
JavaScriptで初心者が覚えておくべき特徴は、「結果が小数になる」という点です。
整数同士でも、JavaScriptでは小数(実数)として返ります。
例)
5 / 2 → 2.5
これは JavaScript の数値が Number 型1つで扱われるためです。直感的で便利な反面、ループの回数やカウント処理に除算結果を使うと、小数が混ざって想定外になることがあります。
また、0で割った場合、JavaScriptはエラーを出さず Infinity(無限大)を返すことがあります。
例)
10 / 0 → Infinity
クラッシュしないのは一見便利ですが、その後の計算が壊れるので、割る前の入力チェックは重要です。非同期処理で取ってきた値を割るような場面でも、型と値の確認が欠かせません。
剰余(%):余りを使うと「周期の処理」が作れる
剰余演算子(%)は割り算の余りを求めます。
例)
10 % 3 → 1
一見地味ですが、実務ではかなり使います。代表例は偶数・奇数の判定です。
例)
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) {
console.log(i + “は偶数です”);
}
}
このように if と組み合わせると「2回に1回」「3回に1回」など、周期的な処理が書けます。
また、値を一定範囲に収める用途にも便利です。
例)曜日を 0〜6 で回す
(n % 7) を使えば、どれだけ大きい数でも結果が 0〜6 に収まります。
カレンダーや電卓、UIの繰り返し表現などを作る段階で、% の便利さを実感するはずです。
++ と –:ループの回数を進めるための基本
インクリメント(++)は 1増やす、デクリメント(–)は 1減らす演算子です。
例)
let x = 10;
x++; // 11
let y = 10;
y–; // 9
一番よく使うのは for ループです。
例)
for (let i = 1; i <= 5; i++) {
console.log(i); // 1〜5
}
ここで i++ が「1周するたびに i を1増やす」役割を持ちます。
なお ++x(前置)と x++(後置)は「値を返すタイミング」が違いますが、初心者のうちはループ制御に出てくる x++ をまず確実に覚えるのがおすすめです。
代入(=):数学の「=」ではなく「入れる」記号
プログラミングの = は、数学の「等しい」ではありません。
意味は「右の値を左の変数に入れる(保存する)」です。
JavaScriptでは主に let と const を使います。
・let:後から値を変えられる(再代入できる)
・const:一度入れたら変えられない(再代入できない)
例)
let age = 25;
age = 26; // OK
const name = “Mike”;
// name = “Judy”; // エラー
初心者が気をつけたいのは、let を増やしすぎると「今この変数に何が入ってるか」が分かりにくくなり、バグにつながることです。
そのため、基本は const を使い、どうしても変わる必要があるときだけ let を使うのが、モダンJavaScriptでよく推奨される考え方です。
複合代入(+= など):短く書けて意図が伝わりやすい
複合代入演算子は「自分自身に計算して、その結果を戻す」書き方です。
・x += 5 は x = x + 5 と同じ
・x -= 3 は x = x – 3 と同じ
例)
let score = 0;
button.addEventListener(“click”, () => {
score += 10; // クリックのたびに10点増える
console.log(“現在のスコア: ” + score);
});
状態を積み上げる(累計する)処理では特に便利です。
DOM操作やイベント処理はコードが長くなりがちなので、こうした短い書き方を使うと読みやすく、メンテもしやすくなります。
優先順位:掛け算・割り算が先(迷ったらカッコとconsole.log)
複数の演算子を一度に書くと「どれから計算されるか(優先順位)」が関わります。
基本は数学と同じで、
と / が先
と – は後
です。順番を変えたいなら ( ) を使います。
例)
let x = 10;
let y = 5;
console.log(x + y * 2); // 20(掛け算が先)
console.log((x + y) * 2); // 30(カッコが先)
JavaScriptは暗黙の型変換もあるので、優先順位と合わさると「一見正しく見えるのに違う」結果が出ることがあります。
その対策として一番効くのが、console.log() で途中結果をこまめに確認することです。
最初はブラウザの開発者ツール(DevTools)で、実際に出力を見ながら「どう動くか」を確認する練習をすると、将来のデバッグ力(調べる力)が大きく伸びます。
算術演算子と代入演算子をしっかり理解できると、DOM操作・イベント処理・アプリ制作へ進むときに、計算部分でつまずきにくくなります。
