instanceof
演算子は、JavaScript においてオブジェクトが指定したクラスのインスタンスであるかどうかを確認するために使用されます。この演算子は、オブジェクトがある特定のコンストラクタ関数を通じて生成されたかを調べる際に非常に有用です。この記事では、instanceof
演算子の基本的な使い方から、注意すべき点、そして具体的なコード例を通してその理解を深めていきます。
instanceof
演算子の基本的な使い方
instanceof
演算子は、次のように使用します。

javascriptobject instanceof Constructor
ここで、object
は確認したいオブジェクト、Constructor
はそのオブジェクトがインスタンスであるかを確認したいクラスやコンストラクタ関数です。この演算子は、object
が Constructor
のインスタンスであれば true
を返し、そうでなければ false
を返します。
例えば、次のコードを見てみましょう。
javascriptfunction Animal() {}
function Dog() {}
Dog.prototype = new Animal();
const dog = new Dog();
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true
ここでは、dog
オブジェクトが Dog
のインスタンスであり、またその親クラスである Animal
のインスタンスでもあることが確認できます。このように、instanceof
はオブジェクトの継承関係をチェックするのにも便利です。
instanceof
とプロトタイプチェーン
instanceof
は、単にオブジェクトが特定のクラスのインスタンスかどうかを調べるだけではなく、そのオブジェクトのプロトタイプチェーンを遡って調べます。これは、オブジェクトが直接的にそのクラスのインスタンスでなくても、継承元のクラスがインスタンスであれば true
を返すことを意味します。
例えば、次のコードを見てみましょう。
javascriptfunction Animal() {}
function Dog() {}
Dog.prototype = new Animal();
const dog = new Dog();
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true
このコードでは、dog
は Dog
のインスタンスであり、Dog.prototype
が Animal
のインスタンスであるため、dog
は Animal
のインスタンスでもあると判断されます。
instanceof
と配列
instanceof
は配列やオブジェクトのインスタンスを確認する際にも使用できます。例えば、次のように配列が配列オブジェクトであることを確認することができます。
javascriptconst arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
配列は Array
のインスタンスであるとともに、JavaScript のすべてのオブジェクトは Object
のインスタンスでもあるため、arr instanceof Object
も true
を返します。
instanceof
と組み込みオブジェクト
JavaScript には、数値、文字列、関数などの組み込みオブジェクトが存在します。instanceof
を使って、それらのオブジェクトが特定の型かどうかを調べることができます。
javascriptconst str = "Hello, world!";
console.log(str instanceof String); // false
console.log(str instanceof Object); // true
const num = 42;
console.log(num instanceof Number); // false
console.log(num instanceof Object); // true
上記のコードで、str
は文字列リテラルであり、num
は数値リテラルですが、どちらもオブジェクトとして扱われるため、Object
のインスタンスとしては true
が返されます。しかし、String
や Number
のインスタンスとしては false
が返されます。
instanceof
とクラス構文
ES6 以降、JavaScript ではクラス構文が導入されました。クラス構文を使用した場合でも、instanceof
は機能します。例えば、次のようにクラスを使ってインスタンスチェックを行うことができます。
javascriptclass Animal {}
class Dog extends Animal {}
const dog = new Dog();
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
このコードでも、dog
は Dog
のインスタンスであり、Dog
は Animal
を継承しているため、dog
は Animal
のインスタンスでもあります。
instanceof
の注意点
instanceof
を使用する際には、いくつかの注意点があります。
-
プリミティブ型のオブジェクト:
プリミティブ型(例えば、number
やstring
)は、それらのラッパーオブジェクト(Number
やString
)とは異なるため、instanceof
で確認する際に予期しない結果を得ることがあります。例えば、"Hello"
はString
のインスタンスではありません。 -
カスタムクラスとプロトタイプ:
カスタムクラスを使用する場合、そのクラスがプロトタイプチェーンを通じて他のクラスを継承しているかどうかに注意が必要です。継承元のクラスをチェックしないと、予期しない結果になることがあります。 -
null
とundefined
:
null
やundefined
はどのクラスのインスタンスでもないため、これらに対してinstanceof
を使用すると常にfalse
が返されます。
javascriptconsole.log(null instanceof Object); // false
console.log(undefined instanceof Object); // false
まとめ
instanceof
演算子は、オブジェクトが特定のクラスのインスタンスであるかどうかを確認するための強力なツールです。特にオブジェクト指向のプログラミングを行う際には、そのオブジェクトの型を正確に把握するために非常に有用です。instanceof
を使用することで、オブジェクトのクラス階層や継承関係を確認し、コードの可読性と堅牢性を向上させることができます。