instanceofについて
instanceofの左側のオペランドはクラスであり、右側のオペランドはオブジェクトを識別するクラスです。左側のオブジェクトが右側のクラスのインスタンスである場合、trueを返します。jsのオブジェクトのクラスは、コンストラクターを初期化することによって定義されます。つまり、instanceofの右のオペランドは関数である必要があります。すべてのオブジェクトはオブジェクトのインスタンスです。左側のオペランドがオブジェクトでない場合はfalseを返し、右側のオペランドが関数でない場合はtypeErrorがスローされます。
instanceof演算子は、オブジェクトがプロトタイプチェーン内のプロトタイプコンストラクターのプロパティであるかどうかをテストするために使用されます。構文はコンストラクターのオブジェクトインスタンスです
instanceof演算子は、2つのオペランドのコンストラクターを比較するために使用されます。カスタムオブジェクトを比較する場合にのみ意味があります。組み込み型を比較するために使用する場合、typeof演算子と同じくらい役に立たないでしょう。
カスタムオブジェクトを比較する
function Foo() {
}
function Bar() {
}
Bar.prototype = new Foo();
new Bar() instanceof Bar; // true
new Bar() instanceof Foo; // true
// 如果仅仅设置 Bar.prototype 为函数 Foo 本身,而不是 Foo 构造函数的一个实例
Bar.prototype = Foo;
new Bar() instanceof Foo; // false
instanceofは組み込みタイプを比較します
new String('foo') instanceof String; // true
new String('foo') instanceof Object; // true
'foo' instanceof String; // false
'foo' instanceof Object; // false
注意すべき点の1つは、instanceofを使用して異なるJavaScriptコンテキスト(ブラウザーの異なるドキュメント構造など)に属するオブジェクトを比較すると、コンストラクターが同じオブジェクトではないため、エラーが発生することです。
結論:instanceof演算子は、同じJavaScriptコンテキストからのカスタムオブジェクトを比較するためにのみ使用する必要があります。typeof演算子と同様に、他の使用法は避ける必要があります。