6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2022年7月10日 instanceofよりも安全にインスタンスかどうかの確認ができる、プライベートフィールドのin演算子

instanceof と inの違い

instanceof
object instanceof constructor

instanceof 演算子は、object のプロトタイプチェーンに constructor.prototype が存在することを検査します。

in
prop in object

in 演算子は、指定されたプロパティが指定されたオブジェクト(またはプロトタイプチェーン)にある場合に true を返します。

in演算子のpropの部分には、プロパティ名を書きます。

プロパティ名または配列のインデックスを表す文字列式またはシンボルです(シンボルではない場合は、文字列に強制変換されます)。

propは基本的に文字列で指定します。

今回学んだprivate宣言できる#のような特殊文字を使用した場合の挙動に着目して検証してみました

class MyClass {
  #brand
  static isMyClass(object) {
    return '#brand' in object;
  }
}

console.log(MyClass.isMyClass(new MyClass())); // false
  • 文字列リテラルを使用した上で#brandとすると、#までも文字列として認識されるので結果はfalseを返しています。 これではin演算子を使用しての求める結果と異なります。

#brandはMyClassのプロパティに存在しているのでtrueなのですが、特殊文字である#特殊文字として扱いたいため、文字列リテラルで囲ってはいけないのです。 では、publicとしての挙動をみてみます。

class MyClass {
  brand
  static isMyClass(object) {
    return 'brand' in object;
  }
}

console.log(MyClass.isMyClass(new MyClass())); //true
  • brandを文字列リテラルで囲わなければ、brandは未定義のエラーになります。
  • 基本的にはin演算子のpropはこのように文字列を指定しないといけません。
  • 特殊文字を指定するときに注意が必要で基本は文字列リテラルを使用します。

instanceofとinの違いのまとめ

instanceofは、オブジェクトのプロトタイプチェーンにconstructor.prototypeが存在するかを判定します。inはプロパティがオブジェクト(またはプロトタイプチェーン)に存在するかを判定します。

参考

in 演算子

instanceof