[JavaScript講座] 演算子の基本と == / ===

当ページのリンクには広告が含まれています。
目次

よく使う算術演算子

基本の算術演算子

const a = 10;
const b = 3;

console.log(a + b); // 13 加算
console.log(a - b); // 7  減算
console.log(a * b); // 30 乗算
console.log(a / b); // 3.333... 除算(整数同士でも小数になる)

console.log(a % b); // 1  剰余(あまり)
console.log(a ** b); // 1000 べき乗(10の3乗)
  • a / b は整数同士でも小数になります(C言語系と違うので注意)
  • % は「割り算のあまり」
  • ** は ES2016 以降のべき乗演算子

単項演算子(+ / -

const x = "10";

console.log(+x);  // 10 (数値に変換しようとする)
console.log(-x);  // -10
  • 単項 + は「数値に変換」しようとします(Number(x) とほぼ同じ)
  • 単項 - は「数値に変換したうえで符号反転」

※ 暗黙の型変換は後で解説しますが、「+ は型変換をすることが多い」と覚えておくとよいです。

インクリメント / デクリメント(++ / --

let n = 1;

n++; // n = n + 1 と同じ
console.log(n); // 2

n--; // n = n - 1 と同じ
console.log(n); // 1

プリフィックス / ポストフィックスで挙動が変わります:

let x = 1;

console.log(x++); // 1(値を返してから +1)
console.log(x);   // 2

let y = 1;
console.log(++y); // 2(先に +1 してから値を返す)
console.log(y);   // 2

実務的にはx++ / ++x はループ以外ではあまり使わない方が読みやすいです。

比較演算子(大小比較)

const a = 10;
const b = 20;

console.log(a > b);  // false
console.log(a < b);  // true
console.log(a >= 10); // true
console.log(a <= 9);  // false

文字列にも使えます(辞書順):

console.log("apple" < "banana"); // true("a" が "b" より小さい)
console.log("2" < "10");         // false(文字列として比較される → "2" > "1")
  • 文字列を数値として比較したいなら、Number("2") < Number("10") のように 明示的に変換します。

論理演算子:&&, ||, !

基本の真偽値演算

const a = true;
const b = false;

console.log(a && b); // false AND(かつ)
console.log(a || b); // true  OR(または)
console.log(!a);     // false NOT(否定)
  • A && B → AとBがどちらも真なら真
  • A || B → AかBのどちらか(または両方)が真なら真
  • !A → 真偽を反転

「真偽値だけ」ではない:短絡評価と戻り値

JavaScript では、&& / || の結果は 必ずしも true / false ではありません。

console.log("hello" && 123);   // 123
console.log(0 && 123);         // 0

console.log("hello" || 123);   // "hello"
console.log("" || 123);        // 123

ルール(重要):

  • A && B
    • A が Falsy なら A を返す
    • A が Truthy なら B を返す
  • A || B
    • A が Truthy なら A を返す
    • A が Falsy なら B を返す

これにより、「デフォルト値」を書くパターンがよく使われます:

const input = "";           // ユーザー入力
const name = input || "名無し"; // input が Falsy(空文字)なら "名無し"

console.log(name); // "名無し"

ただし、0"" を有効な値として扱いたいケースでは || ではなく ??(後の章)を使うのがよくあるパターンです。

+ 演算子の二つの顔(数値加算 vs 文字列連結)

数値同士なら加算

console.log(1 + 2); // 3

文字列がからむと「文字列連結」になる

console.log("a" + "b");   // "ab"
console.log("答えは " + 42); // "答えは 42"
console.log(1 + "2");     // "12"
console.log("2" + 1);     // "21"

ルール:

  • + のオペランドに文字列が含まれていると、多くの場合 文字列連結 が優先される
  • これは暗黙の型変換(後で解説)による挙動です

混乱しやすい例:

console.log(1 + 2 + "3"); // "33" ((1+2)=3 → "3" + "3")
console.log("1" + 2 + 3); // "123"("1"+2 → "12" → "12"+3 → "123")

実務的なコツ:

  • 数値を足したいときは、両方を明示的に number にしておく
const a = Number("1");
const b = Number("2");
console.log(a + b); // 3
  • 文字列連結はテンプレートリテラルを使うと分かりやすい
const name = "Taro";
const score = 90;

console.log(`名前:${name}, 点数:${score}`);
// "名前:Taro, 点数:90"

等価比較:== と === の違い

結論だけ先に

  • == は 「型変換しながら緩く比較」
  • === は 「型も値も同じかどうかを厳密に比較」

実務では:

  • 基本的に ===!== だけ使う
  • == / != は使わない

というルールにしてしまうのが安全です。

具体例で比較

console.log(1 == "1");   // true   型変換される
console.log(1 === "1");  // false  型が違うので false

console.log(0 == false);  // true   (0 ←→ false に変換される)
console.log(0 === false); // false  (number vs boolean)

console.log("" == 0);     // true   ("" が 0 に変換される)
console.log("" === 0);    // false

== は「両側の型を揃えようとして比較する」 ため、直感と外れた結果になることが多いです。

== の有名な罠

有名どころをまとめておきます:

console.log(null == undefined); // true(ここだけ特例)
console.log(null === undefined); // false

console.log("" == 0);       // true
console.log("0" == 0);      // true
console.log(" \n\t" == 0);  // true(空白文字だけの文字列も0に変換される)

console.log(false == "0");  // true
console.log(false == "");   // true

「何でもかんでも型変換される」感覚があればOKですが、
これを全部覚えて安全に使うのはほぼ不可能です。

=== のシンプルさ

=== では 型が違えば必ず false になります。

console.log(1 === "1");      // false
console.log(false === 0);    // false
console.log("" === 0);       // false
console.log(null === undefined); // false

console.log(1 === 1);        // true
console.log("abc" === "abc"); // true
  • 「同じ型で」「同じ値なら」true
  • それ以外は全部 false
    → 覚えることが少なくて済みます。

どうしても == を使いたい場面

例外的に == を使うことがあるとしたら、

if (value == null) {
  // null または undefined のときに実行
}

のように、「null と undefined をまとめて扱いたいとき」です。

しかし、これも

if (value === null || value === undefined) { ... }

と書いてもよいので、あえて == を使う必然性はあまりありません。

Object.is と === の違い

Object.is は、「厳密な同一性」を判定するためのメソッドです。

console.log(Object.is(1, 1));     // true
console.log(Object.is(1, "1"));   // false
console.log(Object.is("a", "a")); // true

=== との違いが出るのは主に 2 つ。

NaN

console.log(NaN === NaN);        // false
console.log(Object.is(NaN, NaN)); // true
  • NaN は「自分自身とは等しくない」という仕様なので、=== でも false
  • Object.is(NaN, NaN) は true になる

+0-0

console.log(+0 === -0);              // true
console.log(Object.is(+0, -0));      // false
  • 数学的には +0-0 は同じですが、
    浮動小数点数としては符号を持っているので Object.is は区別します。

実務的には:

  • NaN の比較が必要なとき → Number.isNaN を使う方が分かりやすいことが多い
  • +0 / -0 を区別する場面はかなりレア

なので、「Object.is というものがあり、=== と微妙に違う」くらいの理解で十分です。

演算子の優先順位

全部暗記する必要はありませんが、よく使うところだけ押さえておきます。

優先順位が高い → 低い順:

  1. ()(丸括弧)
  2. 単項演算子:!, +x, -x, typeof など
  3. 乗除:*, /, %
  4. 加減:+, -
  5. 比較:>, <, >=, <=
  6. 等価:===, !==, ==, !=
  7. 論理AND:&&
  8. 論理OR:||
  9. 代入:=, +=, -= など

困ったら全部 () で括る のが一番安全です。

const result = (a + b) * (c - d);

<<前へ(プリミティブ型とオブジェクト)

>>次へ(モダンな演算子と構文)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次