ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptにおけるtypeof演算子とinstanceof演算子の使用に関するディスカッション_基礎知識

JavaScriptにおけるtypeof演算子とinstanceof演算子の使用に関するディスカッション_基礎知識

WBOY
WBOYオリジナル
2016-05-16 17:33:321093ブラウズ

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 a = 1
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 a1=1; a2=数値(1); var b1="hello";
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:
Copy the code The code is as follows:

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.
Copy code The code is as follows:

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.
Copy code The code is as follows:

function Person() {}
function Man( ) {}
Man.prototype = new Person();
console.log(new Man() instanceof Man); // true
console.log(new Man() instanceof Person); // true
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。