HOWTO · JavaScript

JavaScript で値がオブジェクトかどうかを確認する

このチュートリアルでは、値が JavaScript のオブジェクトであるかどうかを確認します

このページの内容

JavaScript の値がオブジェクトかどうかを調べるには、typeof value === "object" && value !== null を使います。この述語は配列やその他のオブジェクトには true を返し、null と関数には false を返します。関数も対象にする場合は、条件に typeof value === "function" を加えます。JavaScript では関数は呼び出し可能なオブジェクトとして扱われますが、typeof は関数を別の結果として返すため、プログラムの目的に合った判定条件を選んでください。

JavaScript で値がオブジェクトかどうかを instanceof で確認する

instanceof は、コンストラクターの prototype が値のプロトタイプチェーンに含まれているかを調べる演算子です。同じ JavaScript レルム内で作成された通常のオブジェクトなら、value instanceof Object は多くの場合 true になります。value instanceof Date のように、特定のコンストラクターに関連付けられたインスタンスかどうかを確認する用途に便利です。

ただし、あらゆるオブジェクトを判定できるわけではありません。Object.create(null) で作成したオブジェクトのチェーンには Object.prototype がないため、instanceof Object は false になります。別のブラウザーウィンドウや iframe など、別のレルムで作成されたオブジェクトもコンストラクターとプロトタイプが異なるため、現在のレルムにある Object に対する instanceof の判定に失敗することがあります。こうしたケースも含めて一般的にオブジェクトを判定するには、typeof に基づく述語を使ってください。

JavaScript で値がオブジェクトかどうかを typeof で確認する

typeof は関数ではなく演算子で、値を括弧で囲む必要はありません。配列を含む通常のオブジェクトに対しては、typeof value は "object" を返します。覚えておくべき結果が2つあります。typeof null も "object" を返す一方、関数に対する typeof は "function" を返します。そのため、"object" との比較だけでは null が含まれ、関数は除外されます。null を除いたオブジェクトを判定したい場合は、明示的な null チェックを加えてください。

再利用可能なオブジェクト判定を定義する

この述語は、null 以外のオブジェクトには true を返し、関数、プリミティブ値、null には false を返します。次の例では、オブジェクト、null 値、数値、関数を渡したときの結果を示します。

function isObject(value) {
  return value !== null && typeof value === "object";
}

const person = { name: "Ada" };
console.log(isObject(person));
console.log(isObject(null));
console.log(isObject(42));
console.log(isObject(() => {}));

呼び出しごとに、入力と同じ順序で1つの真偽値が出力されます。この定義が判定するのは、意図的に「この値は null 以外のオブジェクトか」です。用途上、関数も含める場合は value !== null && (typeof value === "object" || typeof value === "function") を使ってください。この目的で value.constructor.toString() を調べるのは避けましょう。値に想定したコンストラクターがない場合があり、コンストラクター名やソース文字列も汎用的な型判定として信頼できません。Object(value) === value というパターンにも型変換の挙動があるため、述語が何を判定するのかが曖昧になることがあります。

Object.getPrototypeOf() でオブジェクトのプロトタイプを調べる

Object.getPrototypeOf(value) が答えるのは別の問いで、オブジェクトのプロトタイプを返します。たとえば、Object.getPrototypeOf(Object.create(null)) は null を返し、Object.getPrototypeOf({}) は Object.prototype を返します。継承関係を調べたり、値のプロトタイプを既知のプロトタイプと比較したりするのに役立ちますが、オブジェクト判定の代わりにはなりません。null または undefined を Object.getPrototypeOf() に渡すと TypeError が発生します。それ以外のプリミティブ値はオブジェクトに変換されてから、そのプロトタイプが返されます。一般的なオブジェクト判定ではなく、プロトタイプを調べる必要がある場合にだけ使ってください。