JavaScript | 基礎構文:比較・論理 – NOT

JavaScript JavaScript
スポンサーリンク

NOT とは何か

NOT は「条件を反転する」論理演算です。JavaScript では ! を使い、真(true)なら偽(false)に、偽なら真に変えます。条件式の意味をひっくり返したいときや、「値が存在しない」などの否定条件を表すときに使います。

console.log(!true);  // false
console.log(!false); // true
JavaScript

基本の使い方(否定条件の表現)

if 文で「でなければ」を書きたいときに ! を前につけます。例えば、ログインしていなければ警告を出す、といった使い方です。

const loggedIn = false;
if (!loggedIn) {
  console.log("ログインが必要です");
}
JavaScript

「一致しない」「含まれない」を表現する場合も、肯定条件に NOT をつけると簡潔になります。

const answer = "no";
if (!(answer === "yes")) {
  console.log("YES ではありません");
}
JavaScript

truthy / falsy と NOT の関係

JavaScript では真偽値以外にも「真扱い(truthy)」「偽扱い(falsy)」があります。代表的な falsy は false, 0, -0, 0n, "", null, undefined, NaN。それ以外は基本的に truthy です。! はこれらを真偽に変換したうえで反転します。

console.log(!"hello");     // false(非空文字列は truthy)
console.log(!"");          // true(空文字は falsy)
console.log(!0);           // true(0 は falsy)
console.log(!undefined);   // true(undefined は falsy)
console.log(!123);         // false(数値は 0 以外なら truthy)
JavaScript

存在チェックでは「値が空・未設定・ゼロといった falsy をまとめて弾く」書き方になります。ただし、ゼロや空文字を有効値として扱いたい場面では誤判定になるため注意が必要です。


二重否定(!!)で真偽値に変換する

!! は「真偽値への確実なキャスト」です。最初の ! で反転、次の ! でさらに反転することで、truthy/falsy を true/false に変換します。型を厳密に真偽値にしたいときに便利です。

console.log(!!"text");     // true
console.log(!!"");         // false
console.log(!!0);          // false
console.log(!!123);        // true
console.log(!!null);       // false
JavaScript

フォーム入力やオプションの有無を真偽として扱うときに、!!value を使うと扱いやすくなります。


実用パターン(ガード・否定条件の組み立て)

未設定なら早期リターンする「ガード節」を ! で書くと読みやすくなります。

function greet(name) {
  if (!name) return "名前を入れてください"; // falsy なら打ち切り
  return `こんにちは、${name}さん`;
}
JavaScript

空文字は許可したい場合、falsy 全部を否定すると困るため、厳密比較で絞り込みます。

function setAge(input) {
  if (input === undefined || input === null) return "未設定です"; // 空文字や 0 は許可
  const n = Number(input);
  if (Number.isNaN(n) || n < 0) return "不正な値です";
  return n;
}
JavaScript

否定条件が複雑になったら、肯定条件へ書き換えると理解しやすくなることがあります。例えば「会員ではない、または年齢が未満」を「会員かつ年齢が以上」へ反転するのは、デ・モルガン則の利用です。


デ・モルガン則(NOT の分配)

否定を分配すると、AND と OR が入れ替わります。式を読みやすくしたり、境界条件の漏れを防げます。

// !(A && B) は (!A || !B) と同じ
const A = true, B = false;
console.log(!(A && B) === (!A || !B)); // true

// !(A || B) は (!A && !B) と同じ
console.log(!(A || B) === (!A && !B)); // true
JavaScript

長い否定条件を見かけたら、デ・モルガン則で「肯定条件の組み合わせ」に書き換えることを検討すると、意図が明確になります。


よくある落とし穴と回避策

falsy を一括で否定すると、0(数値のゼロ)や空文字も「未設定」と判定されてしまいます。これを避けるには、必要な値だけを厳密比較で弾くか、関数に名前を付けて意図を明確にします。

function isUnset(v) {
  return v === null || v === undefined;
}

const v1 = 0, v2 = "";
console.log(!v1);         // true(ゼロを未設定扱いしてしまう)
console.log(isUnset(v1)); // false(ゼロは未設定ではない)
console.log(isUnset(v2)); // false(空文字も未設定ではない)
JavaScript

NaN は !NaN が true になりますが、数値の妥当性チェックには Number.isNaN を使うほうが安全です。

const n = Number("x");      // NaN
console.log(!n);            // true(falsy だから)
console.log(Number.isNaN(n)); // true(正しい検出)
JavaScript

例題で理解する

例題1:ログイン必須ページのガード

function showPage(user) {
  if (!user) return "ログインが必要です";
  return `ようこそ、${user.name}さん`;
}
console.log(showPage(null));         // ログインが必要です
console.log(showPage({ name: "Taro" })); // ようこそ、Taroさん
JavaScript

例題2:入力有無の真偽化(!!)

function hasValue(x) {
  return !!x;
}
console.log(hasValue("text")); // true
console.log(hasValue(""));     // false
console.log(hasValue(0));      // false
JavaScript

例題3:否定条件の整理(デ・モルガン則)

function canUse(age, isMember) {
  // 否定形:!(age < 18 || !isMember)
  // 肯定形へ変換:age >= 18 && isMember
  return age >= 18 && isMember;
}
console.log(canUse(20, true));  // true
console.log(canUse(16, true));  // false
JavaScript

まとめ

NOT(!)は条件の真偽を反転し、truthy/falsy の概念に基づいて動作します。!! で真偽値へキャストでき、ガード節や否定条件の整理に役立ちます。ただし、0 や空文字を falsy として一括否定すると意図しない判定が起きるため、未設定の検出は厳密比較や専用関数で行うのが安全です。デ・モルガン則を併用すれば、否定に頼らず読みやすい条件式に整えられます。

タイトルとURLをコピーしました