typeof
とinstanceof
演算子は両方ともデータ型を決定するために使用されますが、使用シナリオが異なり、一部の詳細には特別な注意が必要です。次に調べて、この知識ポイントを徹底的にマスターして、もう面接官の質問を怖がらないようにしましょう。
typeof
、オペランドの前に置かれる単項演算子で、オペランドは任意の型にすることができます。オペランドの型を説明する文字列を返します。栗を見てください:
const type = typeof '中国万歳' // string typeof 666; //数値 typeof true; // ブール値 typeof 未定義; // 未定義 typeof Symbol(); // シンボル typeof 1n; // bigint; typeof () => {}; typeof []; // オブジェクト typeof {}; // オブジェクト typeof new String('xxx'); // オブジェクト typeof null; // object
上記の例からわかるように、 typeof
基本的なデータ型と関数のみを正確に決定できます (関数は実際にはオブジェクトであり、別のデータ型に属しませんが、typeof を使用して区別することもできます)。 Out 参照データ型 (すべての戻りオブジェクト) を正確に決定する必要があります。
注意すべき点は、 typeof null
を呼び出すとobject
返されることです。これは、特別な値null
null オブジェクト (null オブジェクト ポインターとも呼ばれます) への参照と見なされるためです。
参照データ型を正確に判断したい場合は、 instanceof
演算子を使用できます。
instanceof
演算子は、オペランドの後、指定されたオブジェクトの前に配置されます。オペランドが指定されたオブジェクトのインスタンスであるかどうかを示すブール値を返します。
const result = []instanceof Array; // true const 人 = function() {}; const p = 新しい人(); p インスタンスオブパーソン // true; const メッセージ = 新しい String('xxx'); message instanceof String; // true の
typeof はオペランドの基本型を返します。instanceof はブール値を返します。instanceof
は参照データ型を正確に決定できますが、基本データ
型を正確に決定できません。
参照データ型を決定することは不可能です (関数を除く)
typeof
とinstanceof
は両方とも特定の欠点があり、すべてのシナリオのニーズを満たすことはできません。データ型を普遍的に検出する必要がある場合は、 Object.prototype.toString.call()
メソッドを使用できます
。 // "[object Object]" Object.prototype.toString.call([]); // "[オブジェクト配列]" Object.prototype.toString.call(666); // "[オブジェクト番号]" Object.prototype.toString.call('xxx'); // "[object String]"
このメソッドは"[object Object]"
の形式で文字列を返すことに注意してください。
より便利に使用するために、このメソッドをカプセル化できます。
function getType(value) { type = 値の型を設定します。 if (type !== 'object') { // 基本データ型の場合は、直接戻ります return type; } // 参照データ型の場合はさらに判定が行われ、通常の戻り結果は return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1'); } getType(123); // 数値 getType('xxx'); // 文字列 getType(() => {}); getType([]); // 配列 getType({}); // オブジェクト getType(null); // Null