instanceof演算子

(式と演算子)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/instanceof

(判定したいオブジェクト instanceof オブジェクト名称)

オブジェクトがプロトタイプにコンストラクタのprototypeプロパティを持っているかを確認する演算子。簡単に言うと型チェックができる演算子である。
判定したいオブジェクトの種類が、instanceof の後ろに記載したオブジェクト名称と一致する場合はtrue、不一致の場合はfalseを返す。

以下のような例でinstanceof演算子は便利である。

  • Aさん:数値の比較する共通関数を定義。
    引数1の方が大きい場合は1、引数2の方が大きい場合は2、一致する場合は0を返却
  • Bさん:Aさんの作った比較処理をBさんの実装画面から呼び出す。
// Aさんの実装関数
const compareNum = (num1,num2)=> {
    /*Numberオブジェクトかチェック*/
    if(num1 instanceof Number & num2 instanceof Number){
        if(num1 > num2){
            return 1;
        }else if(num1 < num2){
            return 2;
        }else{
            return 0;
        }
    }else{
        console.log('引数がNumberオブジェクトではありません。');
        return "error";
    }
}

// Bさんの実装内容
/*エラーとなるケース*/
console.log(compareNum("文字列",4));  
>> 引数がNumberオブジェクトではありません。error
console.log(compareNum(3,4));
>> 引数がNumberオブジェクトではありません。error

/*正しく利用しているケース*/
let num1 = new Number(4);
let num2 = new Number(12);
console.log(compareNum(num1,num2));
>> 2

上記のBさんの実装において、Numberオブジェクトの使用を強制することができる。
共通関数で、特定のオブジェクト内で用意されている関数などをつかうときには、引数に異なるオブジェクトが渡された場合に意図せぬ動作や結果を返してしまうことがある。
上記例では、Aさんがもしinstanceof演算子の判定をしていないで、Bさんが引数に文字列を指定した場合は、2が返却されてしまう。
また数値チェックで実装も可能だが、Numberオブジェクトかどうか判定することで、数値型であることの保証ができる。
他にも日付オブジェクトや独自で定義したオブジェクトなども、同じように判定できる。

inserted by FC2 system