Boolean
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
論理値 (Boolean) は、 2 つの値、 true または false のどちらかです。これは論理命題の真偽値を表します。
解説
論理値は、通常、関係演算子、等値演算子、[論理 NOT (!)] によって生成されます。また、条件を表す関数、例えばArray.isArray() によっても生成されます。 なお、バイナリー論理演算子、例えば && や || などは、オペランドの値を返します。これらの値は論理値である場合もあれば、そうでない場合もあります。
論理値は一般に条件分岐の検査、例えば if...else や while 文の条件、条件演算子 (? :)、 Array.prototype.filter() の述語の返値などに使用されます。
JavaScript では、論理値への明示的な変換はほとんど必要ありません。 JavaScript は論理値のコンテキストにおいて自動的に変換を行うため、値が真値であるかどうかに基づいて、任意の値を論理値として使用することができます。また、自分のコードでは、if (condition) や if (!condition) を if (condition === true) や if (condition === false) の代わりに使用するよう推奨します。これにより、この規約の利点を活かすことができます。ただし、条件を表す値が常に論理値であることを確認することで、コードの意図を明確にすることができます。
// 良い例:
// これは常に論理値を返す
const isObject = (obj) => !!obj && typeof obj === "object";
// これもよい例:
const isObject = (obj) => Boolean(obj) && typeof obj === "object";
// これもよい例:
const isObject = (obj) => obj !== null && typeof obj === "object";
// 悪い例:
// これは偽値であっても false とは等しくない値が返される可能性がある
const isObject = (obj) => obj && typeof obj === "object";
論理値プリミティブと Boolean オブジェクト
論理値でない値を論理値に変換するには、Boolean を関数として使用するか、二重否定演算子を使用します。 Boolean() コンストラクターを new と一緒に使用しないでください。
const good = Boolean(expression);
const good2 = !!expression;
const bad = new Boolean(expression); // これを使用しない
これは、すべてのオブジェクトが(Boolean オブジェクトで false をラップしているものであっても)真値であり、条件文などの場面では true と評価されるためです。(詳細は下記の論理型への変換の節を参照。)
if (new Boolean(true)) {
console.log("このログは表示されます");
}
if (new Boolean(false)) {
console.log("このログも表示されます");
}
const myFalse = new Boolean(false); // myFalse は Boolean オブジェクト(プリミティブ値 false ではない)
const g = Boolean(myFalse); // g は true
const myString = new String("Hello"); // myString は String オブジェクト
const s = Boolean(myString); // s は true
警告:
コンストラクターとして Boolean を使うことは滅多にありません。
論理型への変換
論理値を期待する多くの組み込み演算は、まず引数を論理値に型変換します。この処理は次のように要約されます。
- 論理値はそのまま返されます。
undefinedはfalseに変換されます。nullはfalseに変換されます。0,-0,NaNはfalseに、それ以外の数値はtrueに変換されます。0nはfalseに、その他のBigIntはtrueに変換されます。Symbolはtrueになります。- すべてのオブジェクトは
trueになります。
メモ:
古い動作により、 document.all はオブジェクトであるにもかかわらず、論理値に変換されると false になります。このプロパティは古く標準外であるため、使用しないでください。
メモ: 文字列への変換や数値への変換などの他の型変換とは異なり、論理型への変換はオブジェクトからプリミティブに変換しようとするわけではありません。
言い換えれば、 false に強制される値はほんの一握りで、これらは偽値 (falsy) と呼ばれる値です。それ以外の値は真値 (truthy) と呼ばれます。値が真値であるかどうかは、論理演算子や条件文と共に使われるとき、あるいはあらゆる論理型の文脈で使われるときに重要です。
JavaScript で型変換と同じ効果を得るには、 2 つの方法があります。
- 二重否定:
!!xはxを 2 回否定し、上記と同じアルゴリズムでxを論理値に変換します。 Boolean()関数、つまりBoolean(x)は上記と同じアルゴリズムを用いてxを論理値に変換します。
なお、真値であるかどうかは、 true または false と緩い等価性があるかどうかと同じではありません。
if ([]) {
console.log("[] は真値です");
}
if ([] == false) {
console.log("[] == false");
}
// [] は真値です
// [] == false
[] は真値ですが、false と緩い等価です。すべてのオブジェクトは真値であるため、[] も真値です。しかし、プリミティブである false と比較する場合、 [] も Array.prototype.toString() によって "" というプリミティブに変換されます。文字列と論理値を比較すると、どちらも数値に変換され、どちらも 0 になるので、[] == false は true となります。一般に、偽値であることと == false は次のようなケースで異なります。
NaN,undefined,nullは偽値ですが、falseと緩い等価ではありません。"0"(および""ではないが 0 に型変換される 他の文字列リテラル)は真値ですが、falseと緩い等価です。- オブジェクトは常に真値ですが、そのプリミティブ表現は
falseと緩い等価になる可能性があります。
真値の値が true と緩い等価になる可能性はさらに低いです。すべての値は真値か偽値のどちらかですが、ほとんどの値は true と false のどちらとも緩い等価ではありません。
コンストラクター
Boolean()-
Booleanオブジェクトを生成します。関数として呼び出された場合、論理型のプリミティブ値を返します。
インスタンスプロパティ
これらのプロパティは Boolean.prototype に定義されており、すべての Boolean インスタンスで共有されます。
Boolean.prototype.constructor-
インスタンスオブジェクトを生成するコンストラクター関数。
Booleanインスタンスの場合、初期値はBooleanコンストラクターです。
インスタンスメソッド
Boolean.prototype.toString()-
このオブジェクトの値に応じて、文字列で
trueまたはfalseのどちらかを返します。Object.prototype.toString()メソッドを上書きします。 Boolean.prototype.valueOf()-
Booleanオブジェクトのプリミティブ値を返します。Object.prototype.valueOf()メソッドを上書きします。
例
>false 値の生成
const bNoParam = Boolean();
const bZero = Boolean(0);
const bNull = Boolean(null);
const bEmptyString = Boolean("");
const bfalse = Boolean(false);
true 値の生成
const btrue = Boolean(true);
const btrueString = Boolean("true");
const bfalseString = Boolean("false");
const bSuLin = Boolean("Su Lin");
const bArrayProto = Boolean([]);
const bObjProto = Boolean({});
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-boolean-objects> |
ブラウザーの互換性
Loading…