JavaScriptのinstanceofの挙動について
instanceof
演算子とは?
instanceof
演算子は、あるオブジェクトが特定のコンストラクタ関数によって生成されたインスタンスかどうかを判定する演算子です。
なぜ一部のリテラルに対してinstanceof
がfalse
を返すのか?
JavaScriptでは、プリミティブ型(数値、文字列、ブーリアン、null、undefined)とオブジェクト型があります。プリミティブ型は値そのものであり、オブジェクトではありません。そのため、instanceof
演算子を用いてプリミティブ型をオブジェクトのインスタンスと比較すると、常にfalse
が返されます。
具体例
console.log(10 instanceof Number); // false
console.log("hello" instanceof String); // false
console.log(true instanceof Boolean); // false
これらの例では、数値、文字列、ブーリアンはプリミティブ型であるため、instanceof
演算子はfalse
を返します。
注意
JavaScriptでは、プリミティブ型をオブジェクトに変換することができますが、その際、新しいオブジェクトが生成されます。この新しいオブジェクトは、元のプリミティブ型とは異なるオブジェクトであり、instanceof
演算子の結果も異なる場合があります。
例
const numObj = new Number(10);
console.log(numObj instanceof Number); // true
この例では、new Number(10)
によって数値10をNumberオブジェクトに変換しているため、instanceof
演算子はtrue
を返します。
// プリミティブ型とinstanceof
console.log(10 instanceof Number); // false
console.log("hello" instanceof String); // false
console.log(true instanceof Boolean); // false
// プリミティブ型をオブジェクトに変換
const numObj = new Number(10);
console.log(numObj instanceof Number); // true
解説
-
プリミティブ型とinstanceof
- JavaScriptでは、数値、文字列、ブーリアンなどのプリミティブ型はオブジェクトではありません。
- プリミティブ型はコンストラクタ関数によって生成されたものではないため、
instanceof
演算子は常にfalse
を返します。
-
プリミティブ型をオブジェクトに変換
new Number(10)
のように、new
演算子を使ってプリミティブ型をオブジェクトに変換することができます。- このようにして生成されたオブジェクトは、
Number
コンストラクタ関数によって生成されたインスタンスであるため、instanceof
演算子はtrue
を返します。
- オブジェクトに変換されたプリミティブ型は、元のプリミティブ型とは異なるオブジェクトであり、パフォーマンスやメモリ使用量に影響を与える可能性があります。
- プリミティブ型をオブジェクトに変換することは、一般的には推奨されません。
typeof演算子
- 返り値は文字列で、
'number'
,'string'
,'boolean'
,'undefined'
,'object'
,'symbol'
のいずれかです。 - プリミティブ型のチェックに適しています。
console.log(typeof 10); // 'number'
console.log(typeof "hello"); // 'string'
console.log(typeof true); // 'boolean'
Object.prototype.toString.call()
- 返り値は文字列で、
'[object Type]'
の形式です。 - より詳細な型情報を取得できます。
console.log(Object.prototype.toString.call(10)); // '[object Number]'
console.log(Object.prototype.toString.call("hello")); // '[object String]'
console.log(Object.prototype.toString.ca ll(true)); // '[object Bo olean]'
カスタム関数
- 特定の条件に基づいて型をチェックするカスタム関数を作成できます。
function isNumber(value) {
return typeof value === 'number' && !isNaN(value);
}
function isString(value) {
return typeof value === 'string';
}
console.log(isNumber(10)); // true
console.log(isString("hello")); // true
選択する方法は、具体的なユースケースによって異なります。
- カスタムの型チェックロジック
カスタム関数 - 単純な型チェック
typeof
演算子
javascript literals instanceof