目次
よく使う算術演算子
基本の算術演算子
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)); // trueNaNは「自分自身とは等しくない」という仕様なので、===でも falseObject.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 というものがあり、=== と微妙に違う」くらいの理解で十分です。
演算子の優先順位
全部暗記する必要はありませんが、よく使うところだけ押さえておきます。
優先順位が高い → 低い順:
()(丸括弧)- 単項演算子:
!,+x,-x,typeofなど - 乗除:
*,/,% - 加減:
+,- - 比較:
>,<,>=,<= - 等価:
===,!==,==,!= - 論理AND:
&& - 論理OR:
|| - 代入:
=,+=,-=など
困ったら全部 () で括る のが一番安全です。
const result = (a + b) * (c - d);
コメント