blog

Js型判定

typeof typeof は単項演算子で、オペランドの前に置かれます。戻り値は、オペランドの型を表す文字列です。 typeof の機能の範囲 typeof は、null 以外のすべての基本クラスを正...

May 8, 2020 · 4 min. read
シェア

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

Read next

香港サーバーへのサイト移行がSEOに与える影響とは?

1、キーワードのレイアウト:キーワードは、サイトのランキングに影響を与える重要な要因の一つであり、サイト上の各ページには、一意のTDKを持っている必要があります、つまり、タイトル、説明、キーワード、およびキーワードの頻度が合理的でなければならない、それはあまりにも偏在している場合、それは検索エンジンに簡単ですが、ごみのページであると考えられています。 2、URLの構造:サイト設計の初めにウェブサイトのURLは、サイトリリースでは、指定されたURLのルールでなければなりません...

May 8, 2020 · 2 min read