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は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はプロパティがオブジェクト(またはプロトタイプチェーン)に存在するかを判定します。