JavaScript / LESSON 03 / JS03

JavaScript:演算子と比較(=== の重要性)

1学習の目的

2基礎解説

種類記号例と結果
算術+ - * / % **7 % 2 → 1(余り)
複合代入+= -= *= /=total += 10
厳密比較=== !==1 === "1" → false
論理&& || !かつ/または/否定
✅ 覚えるべき重要ポイント
  1. 比較は必ず === を使う== は型を自動変換して比較するため 1 == "1" が true になる。この曖昧さがバグの温床で、実務では === が絶対的な標準。
  2. 割り算は整数同士でも小数になる7 / 2 は 3.5)。整数が欲しければ Math.floor()。余りは %
  3. &&両方trueで true、||どちらかtrueで true。! は真偽を反転する。
  4. || は「左が偽なら右を返す」性質があり、既定値の指定に使える(name || "名無し")。ただし 0 や "" も偽扱いになる点に注意。
  5. 0・""・null・undefined・NaN は偽(falsy)として扱われる。それ以外はすべて真。if (name) だけで「空でなければ」を表現できる。

現場使用例:フォーム入力の一致確認 password === confirm、在庫と営業時間の同時判定 stock > 0 && isOpen、未設定時の既定値 config.limit || 100、偶数判定 n % 2 === 0

console.log(7 / 2);          // 3.5   ← 小数になる
console.log(7 % 2);          // 1     ← 余り
console.log(2 ** 10);        // 1024  ← べき乗

let total = 100;
total += 50;                 // total = total + 50
console.log(total);          // 150

// == と === の違い(最重要)
console.log(1 == "1");       // true   ← 型を変換して比較
console.log(1 === "1");      // false  ← 型も含めて比較

// 論理演算子
const stock = 3;
const isOpen = true;
console.log(stock > 0 && isOpen);   // true

// || で既定値を指定できる
const name = "";
console.log(name || "名無し");        // 名無し

3基本ドリル(10問)

JS03-D01 17 を 5 で割った余りを出力せよ。 コーディング★☆☆無料
期待される結果

出力 == 2

ヒント

余りを求める記号は % (パーセント)。

模範解答
console.log(17 % 5);
解説

% は余りを返す演算子で、割合のパーセントとは無関係。偶数判定やグループ分けで頻繁に使う。

JS03-D02 console.log(1 == "1"); の結果はどれか。
A. true B. false C. エラー D. undefined
選択★☆☆無料
期待される結果

解答 == A

ヒント

== は型を自動変換してから比べる。

模範解答
A
解説

文字列の "1" が数値に変換されてから比較されるので true になる。これが意図しない一致を生む原因で、だから === を使う。

JS03-D03 数値 1 と文字列 "1" を === で比較した結果を出力せよ。 コーディング★☆☆無料
期待される結果

出力 == false

ヒント

=== はイコール3つ。型が違えば必ず false。

模範解答
console.log(1 === "1");
解説

型が違う時点で false。値が同じでも型が違えば別物と判定してくれるので、予期せぬ挙動を防げる。

JS03-D04 total に 50 を足し込むコードを完成させよ。 穴埋め★☆☆無料
コード
let total = 100;
total ____ 50;
console.log(total);
期待される結果

出力 == 150

ヒント

「足して代入する」複合代入演算子。

模範解答
+=
解説

total += 50total = total + 50 の省略形。-= *= /= も同じ形で使える。

JS03-D05 true && false の結果はどれか。
A. true B. false C. エラー D. undefined
選択★☆☆無料
期待される結果

解答 == B

ヒント

&& は「かつ」。両方が true のときだけ true。

模範解答
B
解説

&&(かつ)は全部 trueで true、||(または)は1つでも trueなら true。

JS03-D06 stock に 3、isOpen に true を入れ、在庫が1以上 かつ 営業中かどうかを判定した結果を出力せよ。 コーディング★★☆無料
期待される結果

出力 == true

ヒント

&& で2つの条件をつなぐ。isOpen は既にbooleanなので === true は不要。

模範解答
const stock = 3;
const isOpen = true;
console.log(stock >= 1 && isOpen);
解説

booleanの変数はそのまま条件に置くのがJavaScriptらしい書き方。isOpen === true は冗長。

JS03-D07 name が空のとき「名無し」と表示されるコードを完成させよ。 穴埋め★★☆無料
コード
const name = "";
console.log(name ____ "名無し");
期待される結果

出力 == 名無し

ヒント

「または」を表す記号2つ。左が偽なら右が返る性質を使う。

模範解答
||
解説

||左が偽なら右を返すので既定値の指定に使える。ただし 0 も偽なので、0 を有効な値として扱いたい場合は ?? を使う。

JS03-D08 次のうち偽(falsy)として扱われないものはどれか。
A. 0 B. ""(空文字) C. "0"(文字列のゼロ) D. null
選択★★☆無料
期待される結果

解答 == C

ヒント

中身があるかどうかではなく、値そのものを見る。

模範解答
C
解説

"0" は文字が1つ入った文字列なので真。空でない文字列はすべて真になる。0(数値)とは別物という点が引っかけ。

JS03-D09 n に 14 を入れ、偶数かどうかを判定した結果(true / false)を出力せよ。 コーディング★★☆無料
期待される結果

出力 == true

ヒント

2で割った余りが0なら偶数。比較は === を使う。

模範解答
const n = 14;
console.log(n % 2 === 0);
解説

% と === の組み合わせは偶数判定の定番。3の倍数なら n % 3 === 0 と応用できる。

JS03-D10 score に 82 を入れ、三項演算子を使って60以上なら「合格」、未満なら「不合格」と出力せよ。 コーディング★★☆無料
期待される結果

出力 == 合格

ヒント

条件 ? 真のときの値 : 偽のときの値 の形で書く。

模範解答
const score = 82;
console.log(score >= 60 ? "合格" : "不合格");
解説

三項演算子は2択で値を決めるだけのときに使う。処理が複雑になるなら次章の if 文にしたほうが読みやすい。

4実践シナリオ(5問)

JS03-S01 【== と === の違いを確かめる】次の4つの比較結果を1行ずつ出力せよ。
「1 == "1" → true」の形式で表示すること。
1 == "1" ② 1 === "1" ③ 0 == "" ④ 0 === ""
コーディング★★☆無料
期待される結果

出力4行が完全一致

ヒント

テンプレートリテラルの中に比較式を書く。左辺の表示には引用符をそのまま文字として含める。

模範解答
console.log(`1 == "1" → ${1 == "1"}`);
console.log(`1 === "1" → ${1 === "1"}`);
console.log(`0 == "" → ${0 == ""}`);
console.log(`0 === "" → ${0 === ""}`);
解説

== は 0 と空文字まで同じと判定してしまう。これはフォームの未入力チェックで深刻なバグになる。=== なら型が違う時点で false なので安全。

JS03-S02 【パスワード確認】password = "abc12345"、confirm = "abc12345" が完全に一致するかを判定し、「一致:true」の形式で出力せよ。さらに文字数が8文字以上かも「8文字以上:true」の形式で出力すること。 コーディング★★☆無料
期待される結果

出力2行が完全一致

ヒント

一致判定は ===。文字数は .length で取れる。

模範解答
const password = "abc12345";
const confirm = "abc12345";

console.log(`一致:${password === confirm}`);
console.log(`8文字以上:${password.length >= 8}`);
解説

パスワード確認で == を使うと、型の違う値が一致と判定される危険がある。認証系は必ず ===

JS03-S03 【購入可否の判定】stock = 5、isOpen = true、price = 3000、budget = 2500 のとき、次の3つを判定して出力せよ。
「在庫あり かつ 営業中:true」「予算内:false」「購入可能:false」
※購入可能=3つの条件すべてを満たすこと
コーディング★★☆無料
期待される結果

出力3行が完全一致

ヒント

&& を複数つなげられる。予算内は price <= budget。

模範解答
const stock = 5;
const isOpen = true;
const price = 3000;
const budget = 2500;

console.log(`在庫あり かつ 営業中:${stock > 0 && isOpen}`);
console.log(`予算内:${price <= budget}`);
console.log(`購入可能:${stock > 0 && isOpen && price <= budget}`);
解説

&& は何個でもつなげられる。1つでも false があれば全体が false になる。逆に「どれか1つでも満たせばよい」なら || を使う。

JS03-S04 【既定値の落とし穴】設定値として limit1 = 0、limit2 = null がある。それぞれについて ||?? の両方で既定値100を指定し、結果を4行で出力せよ。
「limit1 || 100 → 100」の形式。
コーディング★★★無料
期待される結果

出力4行が完全一致

ヒント

?? は「null か undefined のときだけ」右を返す。0 はそのまま残る。

模範解答
const limit1 = 0;
const limit2 = null;

console.log(`limit1 || 100 → ${limit1 || 100}`);
console.log(`limit1 ?? 100 → ${limit1 ?? 100}`);
console.log(`limit2 || 100 → ${limit2 || 100}`);
console.log(`limit2 ?? 100 → ${limit2 ?? 100}`);
解説

「上限0件」という設定が || では100に化ける——これは実際によくある事故。0 や "" を有効な値として扱いたいなら ?? を使うのが正解。

JS03-S05 【送料と割引の判定】price = 4800、isMember = true、couponCode = "" のとき、次の4行を出力せよ。
「送料無料:false」(5000円以上で無料)
「会員割引:あり」(三項演算子で「あり」「なし」)
「クーポン:なし」(空文字なら「なし」)
「最終判定:割引のみ適用」(会員かクーポンのどちらかがあれば「割引のみ適用」、両方なければ「割引なし」)
コーディング★★★無料
期待される結果

出力4行が完全一致

ヒント

クーポンの有無は couponCode !== "" で判定できる。最終判定は || でつないで三項演算子に渡す。

模範解答
const price = 4800;
const isMember = true;
const couponCode = "";

const hasCoupon = couponCode !== "";

console.log(`送料無料:${price >= 5000}`);
console.log(`会員割引:${isMember ? "あり" : "なし"}`);
console.log(`クーポン:${hasCoupon ? "あり" : "なし"}`);
console.log(`最終判定:${isMember || hasCoupon ? "割引のみ適用" : "割引なし"}`);
解説

判定結果を hasCoupon という変数に切り出すのがポイント。条件式に名前を付けると、後半の複合条件が一気に読みやすくなる。実務では長い条件式ほど名前を付けて分解する。

5仕上げ課題

JS03-FINAL 【注文チェックシステム】注文内容を検証して、判定結果を7行で出力せよ。

const price = 12800;
const qty = 3;
const stock = 5;
const isMember = true;
const budget = 40000;
const inputQty = "3"; // フォームから来た文字列


仕様:
① 小計(price × qty)を計算
② 会員なら10%引き(Math.round で整数化)
③ 在庫が足りているか(qty ≦ stock)
④ 予算内か(割引後 ≦ budget)
入力された数量が正しいか=== で厳密に確認(inputQty は文字列なので Number() で変換してから比較)
⑥ すべて満たせば「注文可能」、1つでも欠ければ「注文不可」

出力仕様(7行):
=== 注文チェック ===
小計:38,400円
割引後:34,560円
在庫OK:true(3 / 5個)
予算内:true
数量の照合:true
判定:注文可能
期待される結果

出力7行が完全一致

ヒント

判定結果はそれぞれ const に入れて名前を付けてから、最後に && でまとめる。数量の照合は Number(inputQty) === qty。金額表示は toLocaleString()。

模範解答
const price = 12800;
const qty = 3;
const stock = 5;
const isMember = true;
const budget = 40000;
const inputQty = "3";

const subtotal = price * qty;
const discounted = isMember ? Math.round(subtotal * 0.9) : subtotal;

const stockOk = qty <= stock;
const budgetOk = discounted <= budget;
const qtyOk = Number(inputQty) === qty;
const canOrder = stockOk && budgetOk && qtyOk;

console.log("=== 注文チェック ===");
console.log(`小計:${subtotal.toLocaleString()}円`);
console.log(`割引後:${discounted.toLocaleString()}円`);
console.log(`在庫OK:${stockOk}(${qty} / ${stock}個)`);
console.log(`予算内:${budgetOk}`);
console.log(`数量の照合:${qtyOk}`);
console.log(`判定:${canOrder ? "注文可能" : "注文不可"}`);
解説

判定を1つずつ変数に切り出してから && でまとめる——これがこの課題の核心。すべてを1行の巨大な条件式に詰め込むと、false になったときどの条件で落ちたのか分からなくなる。名前を付けておけば、出力を見るだけで原因が特定できる。

そして⑤が最重要だ。Number(inputQty) === qty と書けば、"3" と 3 を厳密に照合できる。ここで == を使うと変換なしでも true になってしまい、「たまたま動いている」コードになる。動くかどうかではなく、意図どおりに動くと言い切れるか——それが === を使う理由。

次章では if 文と switch を学ぶ。ここで作った真偽値が、実際に処理を分岐させる材料になる。