JavaScript Tips | 基本・共通ユーティリティ:基本判定・変換 – 真偽値変換

JavaScript JavaScript
スポンサーリンク

「真偽値変換」とは何をするものか

真偽値変換は、「どんな値でも最終的に truefalse に決める」ことです。
業務コードでは、「この値を条件として扱っていいか」「フラグとしてオンなのかオフなのか」をはっきりさせたい場面がとても多くあります。

JavaScript では、if (value) のように書いた瞬間、内部的には「真偽値への変換」が行われています。
この変換のルールをきちんと理解しておかないと、「自分が思っていたのと違う判定」になり、バグの温床になります。


JavaScript の truthy / falsy をざっくり理解する

JavaScript では、「真偽値以外の値」も if 文などで使われると、自動的に truefalse に変換されます。
このとき、false とみなされる値を「falsy」、それ以外を「truthy」と呼びます。

falsy になるのは、次の 7 つだけです。

false
0
-0
0n(BigInt の 0)
""(空文字)
null
undefined
NaN

それ以外は全部 true 扱い、つまり truthy です。
ここがとても重要で、「空配列 [] や空オブジェクト {} も truthy」「文字列 "false" も truthy」という点が、初心者がよくつまずくポイントです。

console.log(Boolean([]));        // true
console.log(Boolean({}));        // true
console.log(Boolean("false"));   // true
console.log(Boolean("0"));       // true
JavaScript

「見た目のイメージ」と「JavaScript の真偽値変換のルール」がズレていると、条件分岐が意図と違う動きをします。
だからこそ、「真偽値変換」をユーティリティとして明示的に扱う価値があります。


Boolean と !! による基本的な真偽値変換

JavaScript で明示的に真偽値に変換する一番基本的な方法は、Boolean(value) を使うことです。

console.log(Boolean(1));        // true
console.log(Boolean(0));        // false
console.log(Boolean(""));       // false
console.log(Boolean("abc"));    // true
console.log(Boolean(null));     // false
console.log(Boolean(undefined));// false
JavaScript

もう一つ、よく使われる書き方が「二重否定演算子」、いわゆる !!value です。

console.log(!!1);        // true
console.log(!!0);        // false
console.log(!!"");       // false
console.log(!!"abc");    // true
JavaScript

!value は「真偽値に変換したうえで反転」し、さらにもう一度 ! を付けることで「反転をもう一度行い、純粋な true / false にする」というテクニックです。
Boolean(value)!!value は、実質同じ意味だと考えて構いません。

業務コードでは、!!value を使って「この値をフラグとして扱う」という意図を表現することがよくあります。

const hasName = !!user.name;  // 名前が空文字や null / undefined なら false
JavaScript

「if (value) に頼りすぎる」と何が危ないのか

if (value) は便利ですが、「0 や空文字も false 扱いになる」という点を理解していないと、簡単にバグになります。

例えば、在庫数を表す stock という変数があるとします。

const stock = 0;

if (stock) {
  console.log("在庫あり");
} else {
  console.log("在庫なし");
}
JavaScript

このコードは、「在庫が 0 のときに“在庫なし”」と判定します。
これは一見正しそうですが、「0 も“有効な値”として扱いたい場面」では問題になります。

例えば、「ユーザーがフォームに 0 と入力した場合は、それも“入力された”とみなしたい」という要件では、if (value) に頼ると「0 が未入力扱い」になってしまいます。

const input = 0;

if (!input) {
  console.log("未入力扱い");  // ここに入ってしまう
}
JavaScript

このようなバグを避けるために、「真偽値変換のルールを理解したうえで、どこで if (value) を使ってよいか」を意識する必要があります。


業務で使える toBoolean ユーティリティの考え方

実務では、「文字列や数値、null / undefined など、いろいろな型の値を“フラグ”として扱いたい」という場面がよくあります。
例えば、環境変数や設定ファイルから "true""false""1""0" が渡ってくるケースです。

そのまま Boolean("false") とすると true になってしまうので、意図した変換ルールを自分で定義する必要があります。

function toBoolean(value) {
  if (typeof value === "boolean") {
    return value;
  }

  if (typeof value === "number") {
    return value !== 0 && !Number.isNaN(value);
  }

  if (typeof value === "string") {
    const normalized = value.trim().toLowerCase();
    if (normalized === "true") return true;
    if (normalized === "false") return false;
    if (normalized === "1") return true;
    if (normalized === "0") return false;
    return normalized.length > 0;
  }

  return Boolean(value);
}
JavaScript

この toBoolean は一例ですが、「どの値を true / false にするか」を自分たちの業務ルールとして決めているのがポイントです。
例えば、文字列 "yes""on" も true とみなしたいなら、そこにルールを追加すればよいだけです。


設定値・環境変数での真偽値変換の実例

環境変数や設定ファイルは、基本的に「文字列」として渡ってきます。
例えば、"true", "false", "1", "0" などです。

const rawFlag = process.env.FEATURE_X_ENABLED;  // 例: "true" や "false"

const isFeatureEnabled = toBoolean(rawFlag);

if (isFeatureEnabled) {
  console.log("機能 X を有効にする");
} else {
  console.log("機能 X を無効のままにする");
}
JavaScript

ここで Boolean(rawFlag) としてしまうと、"false" も truthy なので常に true になってしまいます。
toBoolean のようなユーティリティを用意しておくことで、「設定値の解釈ルール」をコードとして明示できます。

この「ルールを関数に閉じ込める」というのが、業務ユーティリティとして非常に重要な考え方です。
あちこちでバラバラの変換ロジックを書いてしまうと、「この画面では ‘0’ が true 扱い」「あっちでは false 扱い」など、仕様のブレが発生しやすくなります。


入力値の真偽値変換とバリデーション

フォーム入力などで、「チェックボックスの値」「ラジオボタンの値」「テキスト入力で ‘true’ / ‘false’ を受け取る」ようなケースもあります。
このときも、「どの文字列を true / false とみなすか」を決めておくと、バリデーションが書きやすくなります。

例えば、「’true’ / ‘false’ 以外はエラーにしたい」という場合は、次のようにします。

function parseStrictBoolean(value) {
  if (typeof value !== "string") {
    throw new Error("真偽値は文字列で指定してください");
  }

  const normalized = value.trim().toLowerCase();

  if (normalized === "true") return true;
  if (normalized === "false") return false;

  throw new Error(`'true' または 'false' だけが許可されています: ${value}`);
}
JavaScript

このように、「変換できない値は例外にする」パターンと、「変換できない値は false に寄せる」パターンを使い分けることも、実務ではよくあります。
どちらを選ぶかは、「そのフラグが安全側に倒れるべきかどうか」という観点で決めるとよいです。


真偽値変換ユーティリティを使った安全な条件分岐

真偽値変換をユーティリティにまとめておくと、条件分岐がかなり読みやすくなります。

例えば、ユーザー設定のフラグを扱うコードを考えます。

const rawConfig = {
  darkMode: "true",
  receiveMail: "0",
};

const config = {
  darkMode: toBoolean(rawConfig.darkMode),
  receiveMail: toBoolean(rawConfig.receiveMail),
};

if (config.darkMode) {
  console.log("ダークモードを有効にする");
}

if (config.receiveMail) {
  console.log("メール通知を有効にする");
}
JavaScript

ここでは、「設定値を受け取る層」と「真偽値として使う層」を分離しています。
この分離ができていると、「途中で ‘true’ / ‘false’ の文字列が紛れ込んでバグる」といった事故を防ぎやすくなります。


小さな練習で感覚をつかむ

最後に、理解を定着させるための練習を提案します。
toBooleanparseStrictBoolean を自分で実装して、次のような値を片っ端から渡してみてください。

true, false, 1, 0, -1, "true", "false", "1", "0", "yes", "no", "", " ", null, undefined, [], {} などです。

その結果をコンソールに出しながら、「このプロジェクトなら、どの値を true / false にしたいか?」を自分なりに言語化してみると、
「なんとなく if に突っ込む」から「意図を持って真偽値に変換する」へ、一段レベルアップできます。

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