404 Not Found

404 Not Found


nginx

JavaScriptの演算子

演算子はJavaScriptに何の操作を実行するかを指示する記号です。毎日+で加算していますが、JSの演算子は算術だけではありません。代入、比較、論理評価もすべて演算子に依存しています。このレッスンでは、最もよく使う演算子を一挙にカバーします。

算術演算子

演算子 意味
+ 加算 5 + 38
- 減算 5 - 32
* 乗算 5 * 315
/ 除算 6 / 32
% 剰余 7 % 31
** べき乗 2 ** 38
++ インクリメント x++ または ++x
-- デクリメント x-- または --x

剰余演算子%は特に便利で、奇数/偶数の判定やループでの折り返しなどに使われます。**はES2016で追加されたべき乗演算子で、Math.pow()と同等ですがより簡潔です。

前置と後置の++ / --の違い:前置は変更してから返し、後置は返してから変更します。同じ行に複数の++を連結しないでください — 読めない謎かけのようになります。

実例:算術演算子の基礎

HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>算術演算子</title>
</head>
<body>
  <h3>算術演算子デモ</h3>
  <pre id="output"></pre>
  <script>
    var out = document.getElementById('output');
    var a = 17, b = 5;

    var lines = [];
    lines.push('a = ' + a + ', b = ' + b);
    lines.push('a + b  = ' + (a + b));
    lines.push('a - b  = ' + (a - b));
    lines.push('a * b  = ' + (a * b));
    lines.push('a / b  = ' + (a / b));
    lines.push('a % b  = ' + (a % b));
    lines.push('a  b = ' + (a  b));

    var x = 10;
    lines.push('');
    lines.push('x = 10');
    lines.push('x++  = ' + (x++) + '  (後置:古い値を返し、xは' + x + 'に)');
    lines.push('++x  = ' + (++x) + '  (前置:先に変更、xは' + x + 'に)');

    out.textContent = lines.join('\n');
  </script>
</body>
</html>

代入演算子

=は代入であり、数学的な「等しい」ではありません。これは初心者にとって最もよくある落とし穴の一つで、if (x = 5)はエラーにならず、xに5を代入して5(truthy)を返すため、条件は常にtrueになります。

複合代入は省略記法です:

省略記法 等価
x += 5 x = x + 5
x -= 3 x = x - 3
x *= 2 x = x * 2
x /= 4 x = x / 4
x %= 3 x = x % 3

実例:代入演算子

HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>代入演算子</title>
</head>
<body>
  <h3>代入演算子デモ</h3>
  <pre id="output"></pre>
  <script>
    var out = document.getElementById('output');
    var lines = [];

    var score = 80;
    lines.push('初期スコア = ' + score);

    score += 10;
    lines.push('score += 10 → ' + score);

    score -= 25;
    lines.push('score -= 25 → ' + score);

    score *= 2;
    lines.push('score *= 2  → ' + score);

    score /= 3;
    lines.push('score /= 3  → ' + score.toFixed(1));

    score %= 30;
    lines.push('score %= 30 → ' + score.toFixed(1));

    out.textContent = lines.join('\n');
  </script>
</body>
</html>

比較演算子

演算子 意味
== 緩い等価(型変換を行う)
=== 厳密等価(型変換なし)
!= 緩い不等価
!== 厳密不等価
> 大なり
< 小なり
>= 以上
<= 以下

⚠️ =====の落とし穴:これはJavaScriptで最も有名な落とし穴です。==は暗黙的に型変換を行い、"5" == 5trueになります!一方===は型と値の両方が一致する必要があり、"5" === 5falseです。型変換が特に必要な場合を除き、常に===を使いましょう。同様に、!=の代わりに!==を使います。

実例:==と===の落とし穴

HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>==と===</title>
</head>
<body>
  <h3>緩い等価と厳密等価</h3>
  <pre id="output"></pre>
  <script>
    var out = document.getElementById('output');
    var lines = [];

    lines.push('"5" == 5   → ' + ("5" == 5));
    lines.push('"5" === 5  → ' + ("5" === 5));
    lines.push('');
    lines.push('0 == false   → ' + (0 == false));
    lines.push('0 === false  → ' + (0 === false));
    lines.push('');
    lines.push('"" == false  → ' + ("" == false));
    lines.push('"" === false → ' + ("" === false));
    lines.push('');
    lines.push('null == undefined  → ' + (null == undefined));
    lines.push('null === undefined → ' + (null === undefined));
    lines.push('');
    lines.push('5 != "5"   → ' + (5 != "5"));
    lines.push('5 !== "5"  → ' + (5 !== "5"));

    out.textContent = lines.join('\n');
  </script>
</body>
</html>

どうですか?0 == false"" == falseがどちらもtrueです — まったく直感に反します。りんごとオレンジを比較するようなもので、==は「どちらも果物だから近い」と言い、===は「同じではない」と言います。===を坚守すれば、バグの半分を防げます。

論理演算子

演算子 意味 説明
&& AND 両側がtruthyのときのみtrue
|| OR どちらかがtruthyのときtrue
! NOT 値を反転させる

&&||には短絡評価という便利な機能があります。&&は最初のfalsy値で停止し、||は最初のtruthy値で停止します — 残りは評価されません。これは簡潔な条件代入によく使われます:

HTML
<script>
var name = userInput || '名無し';
</script>

実例:論理演算子と短絡評価

HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>論理演算子</title>
</head>
<body>
  <h3>論理演算子デモ</h3>
  <pre id="output"></pre>
  <script>
    var out = document.getElementById('output');
    var lines = [];

    var age = 20;
    var hasTicket = true;

    lines.push('age = ' + age + ', hasTicket = ' + hasTicket);
    lines.push('age >= 18 && hasTicket → ' + (age >= 18 && hasTicket));
    lines.push('age >= 18 || hasTicket → ' + (age >= 18 || hasTicket));
    lines.push('!hasTicket          → ' + (!hasTicket));
    lines.push('');

    lines.push('--- 短絡評価 ---');
    lines.push('1 && "hello"  → ' + (1 && "hello"));
    lines.push('0 && "hello"  → ' + (0 && "hello"));
    lines.push('1 || "hello"  → ' + (1 || "hello"));
    lines.push('0 || "hello"  → ' + (0 || "hello"));
    lines.push('');

    var username = '';
    var displayName = username || 'ゲスト';
    lines.push('空文字 || "ゲスト" → ' + displayName);

    out.textContent = lines.join('\n');
  </script>
</body>
</html>

文字列との+演算子

+が文字列に出会うと、結合演算子になります。片方が文字列であれば、もう片方も文字列に変換されて結合されます。

HTML
<script>
"Hello" + " " + "World"   // "Hello World"
"数値: " + 42             // "数値: 42"
3 + 4 + "px"              // "7px"(3+4=7が先に計算され、その後結合)
"px" + 3 + 4              // "px34"(左から右へ:"px"+3="px3"、その後+4)
</script>

"px" + 3 + 4"px7"ではなく"px34"になるのは、古典的な面接の落とし穴です。+は左から右に評価され、左側が文字列になると、その後のすべてが結合になります。

三項演算子の概要

三項演算子はif...elseの省略記法で、構文は条件 ? 値1 : 値2です。

HTML
<script>
var status = age >= 18 ? '成人' : '未成年';
</script>

条件がtruthyなら値1を返し、そうでなければ値2を返します。シンプルな条件では三項演算子が適していますが、ネストしないでください — a ? b ? c : d : eは混乱の元です。詳細な使い方はレッスン10で扱います。

演算子の優先順位

JavaScriptは優先順位に基づいて評価順序を決定し、数学で学んだのと同じルールに従います:乗算と除算は加算と減算の前、括弧が最初です。

HTML
<script>
2 + 3 * 4     // 14、20ではない
(2 + 3) * 4   // 20
</script>

一般的な優先順位(高い順):()!*** / %+ -> < >= <=== === != !==&&||?:=

迷ったら括弧を追加しましょう。括弧は無料ですが、バグは高額です。


📖 まとめ

❓ よくある質問

Q なぜ"1" + 2 + 3"15"ではなく"123"になるのですか?
A +は左から右に評価されます。"1" + 2は文字列"12"を生成し、次に"12" + 3"123"になります。先に数値を加算したい場合は括弧を使います:"1" + (2 + 3)"15"になります。
Q なぜ0 == falseはtrueなのですか?
A ==は比較の前に型変換を行います。0falseの両方が数値0に変換されるため、等しくなります。これが===が推奨される理由で、型変換を行わないため0 === falsefalseです。
Q x++++xの違いは何ですか?
A 単独で使用する場合、どちらもxを1増加させます。違いは式の戻り値にあり、x++は増加前の古い値を返し、++xは増加後の新しい値を返します。例えば、var a = 5; var b = a++;はa=6、b=5になりますが、var a = 5; var b = ++a;はa=6、b=6になります。

📝 演習

  1. 3桁の数値(例:371)を入力として受け取り、%/を使って百の位、十の位、一の位を抽出して表示するプログラムを書いてください。
  2. if...elseを使わずに、三項演算子を1行で使って年変数yearがうるう年かどうかを判定し、結果をisLeapに代入してください(ヒント:4で割り切れて100で割り切れない、または400で割り切れる)。
  3. 以下の式の結果を予測し、ブラウザのコンソールで検証してください:[] == false[] == ![]null == 0。理由を説明してください — 説明できない場合は、==の暗黙的型変換ルールを復習してから、===を坚定して使いましょう。
100%