typeof
typeof は単項演算子で、オペランドの前に置かれます。戻り値は、オペランドの型を表す文字列です。
typeof機能スコープ
typeofはnullを除くすべての基本型を正しく判定し、参照型については関数を除くすべてをオブジェクトとして判定します。
typeof null // 'object'
typeof undefined; // "undefined"
typeof false; // "boolean"
typeof 1; // "number"
typeof '1'; // "string"
typeof {}; // "object"
typeof []; // "object"
typeof new Date(); // "object"
typeof Symbol(); // "Symbol"
typeof 123n // 'bigint'
typeof
Javascriptのバイナリの最初の3桁は、オブジェクトのタイプ情報を格納します。
instanceof
平たく言えば、instanceof はオブジェクトが特定のコンストラクタのインスタンスであるかどうかを比較するために使われます。instanceof 演算子はオブジェクトに対してのみ使用でき、プリミティブ型の値には使用できないことに注意してください。
instanceof機能スコープ
instanceofは基本型を判定することはできませんが、参照型を正しく判定することはできます。
// 偽を出力する
console.log('Fifi' instanceof String)
// 真を出力する
console.log(new Date() instanceof Date)
instanceof
object instanceof constructor : constructor.prototypeパラメータオブジェクトのプロトタイプチェーンに存在するかどうかをチェックします。
手書きの instanceof
/**
カスタムinstanceof
*/
function instanceOf(left, right) {
let proto = left.__proto__
while(proto){
if(proto === right.prototype){
return true
}
proto = proto.__proto__
}
return false
}
class A{}
class B extends A {}
class C{}
const b = new B()
// 真を出力する
console.log(instanceOf(b,B))
// 真を出力する
console.log(instanceOf(b,A))
// 偽を出力する
console.log(instanceOf(b,C))
Object.prototype.toString
// 以下の11種類である:
var number = 1; // [object Number]
var string = '123'; // [object String]
var boolean = true; // [object Boolean]
var und = undefined; // [object Undefined]
var nul = null; // [object Null]
var obj = {a: 1} // [object Object]
var array = [1, 2, 3]; // [object Array]
var date = new Date(); // [object Date]
var error = new Error(); // [object Error]
var reg = /a/g; // [object RegExp]
var func = function a(){}; // [object Function]
function checkType() {
for (var i = 0; i < arguments.length; i++) {
console.log(Object.prototype.toString.call(arguments[i]))
}
}
checkType(number, string, boolean, und, nul, obj, array, date, error, reg, func)
上記11の他に、以下のものがあります:
console.log(Object.prototype.toString.call(Math)); // [object Math]
console.log(Object.prototype.toString.call(JSON)); // [object JSON]
上記13名に加え、以下の通り:
function a() {
console.log(Object.prototype.toString.call(arguments)); // [object Arguments]
}
a();
ですから、認識できるタイプは少なくとも14種類あり、少なくとも12の[[クラス]]属性があることは確かです。
オブジェクトのコンストラクタのプロパティから判断すると
コンストラクタの判定方法はinstanceofと似ていますが、Objectのコンストラクタ判定とinstanceofのコンストラクタ判定は同じではなく、コンストラクタはオブジェクト型だけでなく、基本的なデータ型の判定にも対応できます。
コンストラクタ属性は、どのコンストラクタが特定のインスタンスオブジェクトを生成したかを示します。
コンストラクタ属性は、プロトタイプ・オブジェクトとコンストラクタの関係を表します。 プロトタイプ・オブジェクトが変更された場合、コンストラクタ属性を参照する際のエラーを防ぐため、一般的にコンストラクタ属性も同時に変更されます。したがって、プロトタイプ・オブジェクトを変更する際には、コンストラクタ属性も同時に変更する必要があります。
console.log('22'.constructor === String) // true
console.log(true.constructor === Boolean) // true
console.log([].constructor === Array) // true
console.log(document.constructor === HTMLDocument) // true
console.log(window.constructor === Window) // true
console.log(new Number(22).constructor === Number) // true
console.log(new Function().constructor === Function) // true
console.log((new Date()).constructor === Date) // true
console.log(new RegExp().constructor === RegExp) // true
console.log(new Error().constructor === Error) // true
備考:
1. null と undefined にはコンストラクタがありません。
2.コンストラクタ使用時の数値の判定、123.constructorと書くとエラーになります。
3. クラス継承のコンストラクタは、オブジェクトが上書きされるため、エラーとなり、検出結果は正しくありません。
//継承がある場合、コンストラクタの使用が問題になることに注意する。
function A() {};
function B() {};
A.prototype = new B(); //ABから継承された
console.log(A.constructor === B) -------->false
var C = new A();
//次に、CがAのコンストラクタと同じかどうかを判断する。
console.log(C.constructor === B) -------->true
console.log(C.constructor === A) -------->false
//この状況を解決するには、通常、手動でオブジェクトのコンストラクタのポイントを調整する
C.constructor = A; //オブジェクトのコンストラクタ属性に独自のクラスを割り当てる。
console.log(C.constructor === A); -------->true
console.log(C.constructor === B); -------->false





