JavaScript コードを作成する場合、typeof と instanceof の 2 つの演算子が時々使用され、必ず使用する必要があります。しかし!これらの演算子を使用すると、望ましい結果を直接得るのは常に困難です。「これら 2 つの演算子は、おそらく JavaScript の最大の設計上の欠陥です。なぜなら、これらの演算子から望ましい結果を得るのはほぼ不可能だからです。」
typeof
説明: typeof は式のデータ型の文字列を返し、戻り結果は数値、ブール値、文字列、オブジェクト、未定義、関数を含む js の基本データ型です。
説明文を見る限り、問題はなさそうです。
次のコードは数値変数を書き込み、typeof の後の結果は「number」です。
var a = 1; .log( typeof(a)); //=>number
Number 型のコンストラクター new を使用して変数を作成すると、typeof の後の結果は「object」になります。
var a = new Number(1);
console.log(typeof(a)); //=>object
上記の 2 つの出力結果は問題ないようですが、これは本から見て当然のことのようです. JavaScript がそのように設計されているからです。
でも!問題は、typeof が呼び出されるので、値を使用して直接作成されたか、型コンストラクターを使用して作成されたかに関係なく、変数の型を正確に返さなければならないことです。他に何に使えばいいの?
つまり:
var a = 1;
var b = new Number(1);
正確に言えば、目的の結果を得るには、変数 a と変数 b の型は Number である必要があります。
正確な型情報は、変数の内部プロパティ [[Class]] の値に格納されます。これは、Object.prototype で定義されたメソッド toString を使用して取得されます。
型情報の取得:
var a = 1;
var b = new Number(1);
console.log(Object.prototype.toString. call(b ));
出力:
[オブジェクト番号]
これはすでに非常に簡単ではないでしょうか。少し処理して直接の結果を取得してみましょう:
var b = new Number(1);
console.log(Object.prototype.toString.call(a).slice(8,-1));
console.log(Object.prototype.toString.call(b).スライス(8,-1));
出力:
数値
数値
これは望ましい結果です。
より良く使用するために、変数が特定の型であるかどうかを判断するメソッドをカプセル化します。
コードをコピー
コード function is(obj,type) {
var clas = Object.prototype.toString.call(obj).slice(8, -1); obj !== unknown && obj !== null && clas === type;
}
まず、それらの typeof 出力を見てみましょう。
コードをコピーします
var c1=[1,2,3]; =new Array(1 ,2,3);
console.log("a1 の typeof:" typeof(a1));
console.log("a2 の typeof:" typeof(a2)); console.log(" b1 の typeof:" typeof(b1));
console.log("b2 の typeof:" typeof(b2));
console.log("c1 の typeof:" typeof(c1)) ;
console .log("c2 の typeof:" typeof(c2));
出力:
a1 の typeof:number
a2 の typeof:object
b1 の typeof:string
b2 の typeof :object
c1 の typeof:object
c2 の typeof:object
The newly created function we use is:
console.log("a1 is Number:" is(a1,"Number"));
console.log("a2 is Number:" is(a2,"Number"));
console.log( "b1 is String:" is(b1,"String"));
console.log("b2 is String:" is(b2,"String"));
console.log("c1 is Array :" is(c1,"Array"));
console.log("c2 is Array:" is(c2,"Array"));
Output:
a1 is Number:true
a2 is Number:true
b1 is String:true
b2 is String:true
c1 is Array:true
c2 is Array:true
Note: typeof It is not useless. The actual use is to detect whether a variable has been defined or assigned a value.
instanceof Description: Determine whether an object is a certain data type, or whether a variable is an instance of an object.
The instanceof operator is also powerless when used to compare two built-in type variables, and will also be dissatisfied with the result.
console.log("abc" instanceof String); / / false
console.log("abc" instanceof Object); // false
console.log(new String("abc") instanceof String); // true
console.log(new String( "abc") instanceof Object); // true
Reflects the relationship accurately only when comparing custom objects.
function Person() {}
function Man( ) {}
Man.prototype = new Person();
console.log(new Man() instanceof Man); // true
console.log(new Man() instanceof Person); // true