JavaScriptでinstance ofとtypeof演算子の使い方と違いを詳しく解析します.

6762 ワード

JavaScriptのinstance ofとtypeofは、変数の種類(例)を判断するためによく使われますが、それらの使用には違いがあります.
typeof演算子は、表式を表すデータタイプの文字列を返します.
typeof expression
expressionパラメータは、タイプ情報を検索するために必要な任意の表現です.
typeofは1つの単項演算子であり、1つの演算数の前に置く.
typeof演算子は、タイプ情報を文字列として返します.typeofの戻り値は6つの可能性があります.「number」「string」「bollan」「object」「function」「undefined.」
(ECMAScriptは5種類のオリジナルタイプがあります.すなわち、Unidefined、Null、Boolean、Number、Stringです.)
コメント:
1、ECMAScriptの5種類のオリジナルタイプについて述べましたが、typeofオペレータを使う場合、特に「対象タイプ」と「対象値」の違いを区別する必要があります.例えばBooleanオブジェクトはBoolean元のタイプの参照タイプであり、trueとfalseはBooleanオブジェクトの2つの可能なオブジェクト値である.ECMAScriptの事前定義の対象(他の言語のクラスに対して)をそれぞれの種類の元の値のパッケージ(またはパッケージ)と見なすことができます.ECMAScriptのすべての事前定義の対象はまたObjectの対象に継承されます.したがって、次のような場合があります.
 
  
  var testvar= new Number(68);
  alert(typeof testvar);  //   "object"
  testvar= 68;
  alert(typeof testvar);  //   "number"
また、
 
  
  function Person(){}
  document.write ("
typeof(Person):"+typeof(Person));    //function
  var person = new Person();
  document.write ("
typeof(person):"+typeof(person));    //object
注意:伝統的な意味では、ECMAScriptは本当にクラスを持っていません.実は説明以外には、ECMA-622には「類」という言葉がありません.ECMAScriptは「オブジェクト定義」を定義しています.論理的には他のプログラミング言語のクラスに相当します.
また、これらの事前定義オブジェクトはObjectオブジェクトのValueOf()をカバーし、元の値を返します.これらのオブジェクトのすべての属性および方法は、それらが疑似オブジェクトであるため、それぞれのタイプの元の値に適用されてもよい.
2、typeof演算子はnull値に対して「Object」を返します.これは実際にJavaScriptが最初に実現した誤りで、ECMAScriptによって引き継がれました.現在、nullは対象のプレースホルダと考えられており、この矛盾を説明していますが、技術的にはまだオリジナルの値です.
ヒント:
1、値undefinedは、未定義の値とは異なります.ただし、typeof演算子はこの2つの値を本当に区別していません.以下のコードを考慮します.
var o Tempalert(typeof oTemp) //「undefined」alert(typeof oTemp 2)を出力します. //出力「undefined」
前のコードは両方の変数に対して出力されます.変数oTemp 2だけが宣言されたことがありません.typeof以外の他の演算子をoTemp 2に使用すると、エラーが発生します.他の演算子はすでに宣言された変数にしか使用できないためです.
2、関数に明確な戻り値がない場合、戻り値も「undefined」となります.
Function testFun(){}alert(testFun()=undefined); //出力「true」3、タイプNullは専用値nullだけで、字面の量です.値undefinedは実際に値nullから派生したので、ECMAScriptはそれらを等しく定義します.
alert(null=undefined); //出力「true」はこの2つの値が等しいにもかかわらず、それらの意味は違っています.
undefinedは、変数を宣言していますが、初期化されていないときにその変数に与えられた値または未宣言の変数です.
nullは、まだ存在していないオブジェクト(つまり、オブジェクトが空か、またはオブジェクトが見つからない)を表すために使用されます.関数または方法がオブジェクトである場合、そのオブジェクトが見つからない場合、戻りは通常nullです.
3、typeofを使って、if(typeof a!=「undefined」){alert(「ok」)}のような変数が存在するかどうかを取得できます.if(a)はaが存在しないとエラーが発生するからです.
Arayに対して、Nullなどの特殊な対象はtypeofを使ってすべてObjectに戻ります.これはtypeofの限界です.オブジェクトが配列であるかどうかを取得したい場合、または変数がオブジェクトであるかを判断する場合は、instance ofを選択します.
instance of演算子は、typeof演算子を使用する際に参照タイプの記憶値を使用すると問題が発生します.参照の種類に関係なく、オブジェクトは「object」に戻ります.ECMAScriptは他のJava演算子instance ofを導入してこの問題を解決します.
instance of演算子は、処理中のオブジェクトの種類を識別するために、typeof演算子と似ています.typeofメソッドとは違って、instancentofメソッドは、開発者に特定のタイプのオブジェクトを明確に確認するよう要求します.たとえば:
var oString Object=new String(「ハローワールド」);alert(oString Object instance of String); //「true」を出力するこのコードは「変数oStrigObjectはStringオブジェクトの例ですか?」と聞きました.typeofメソッドのように柔軟ではないが、typeofメソッドが「object」に戻る場合には、instance ofメソッドが有用である.
instance of演算子
は、二項演算子です.Boolean値を返し、オブジェクトが特定のクラスの一例であるかどうかを指摘します.
expression  instance of class
パラメータ
 expression  必ず選択します.オブジェクトの表式.
 クラス必須オプション.指定されたオブジェクトクラスを指定します.
もしobjectがclassの一例であれば、instance of演算子はtrueに戻ると説明します.Objectが指定されたクラスの一例ではない場合、またはObjectがnullである場合、falseに戻ります.
変数がオブジェクトのインスタンスかどうかを判断するために使用されます.
var a=new Aray()のようです.alert(a instance of Aray);trueに戻ります.同時にalertもtrueに戻ります.これはArayがobjectのサブクラスだからです.
更に例:function test(){}var a=new test();alert(a instance of test)はtrueに戻ります.
注意:
Functionのargmentsについては、argmentsはArayだと思われているかもしれませんが、instaceofを使ってテストすると、argmentsはArayオブジェクトではなく、見た目は似ています.
また、類似の場合があります.例えば、
var a=new Aray();if(a instance of Object)alert('Y')else alert('N')得る
しかしif(window instance of Object)alert('Y')else alert('N')Nを得る
だから、ここのinstance ofテストのobjectはjs文法の中のobjectを指して、domモデルの対象を指すのではありません.
この時typeofを使うとちょっと違います.alert(typeof(window)はobjectを得られます.
JavaScriptのinstance ofオペレータの原理は何ですか?
jsを勉強する時、jsの中の一例があるタイプに属するかどうかを判断する時、instance ofオペレータ、例えば、function Person(){}を使用することができます.
var person=new Person()  alert(person instance of Person)//trueに戻る
instance ofという操作を実行している時に、どのような判断を経てtrue/falseに戻りましたか?
Person.prototypeとpersonの内部ポインタ[prototype]の両方が引用されているかどうかを判断することで結果が出ますか?
実際には、例の「プロトタイプオブジェクトチェーン」において、この構造関数のプロトタイプ属性が指すプロトタイプのオブジェクトを見つけたら、trueに戻ります.
プロトタイプは、インスタンスが持つ属性(またはインスタンスのプロトタイプ属性はundefined)ではなく、プロトタイプオブジェクトの属性です.改ざんされたら、この判断方法は正しく戻りません.また、person.com nstructor==Personを直接判断して欲しい結果を得ることができますか?
私たちはテストをします.以下のJavaScriptコードです.
 
  
function Person(name,sex){this.name=name;this.sex=sex;}
document.write ("
typeof Person:"+typeof Person);
document.write ("
typeof Person.prototype:"+typeof Person.prototype);
document.write ("
typeof Person.constructor:"+typeof Person.constructor);

var person = new Person();
document.write ("

var person = new Person();");
document.write ("
typeof person:"+typeof person);
document.write ("
typeof person.prototype:"+typeof person.prototype);
document.write ("
typeof person.constructor:"+typeof person.constructor);

document.write ("

Function.constructor:"+Function.constructor);
document.write ("

Function.prototype:"+Function.prototype);

document.write ("

Person.constructor:"+Person.constructor);
document.write ("

Person.prototype:"+Person.prototype);


document.write ("

person.constructor:"+person.constructor);
document.write ("

person.prototype:"+person.prototype);

出力は以下の通りです
typeof Person:functionype of Person.prototype:object typeof Person.com nstructor:function
var person=new Person()typeof person:object typeof person.prototype:undefinedtypeof person.com nstructor:function
Function.com nstructor:function Function(){native code}Function.prototype:function Empty(){}
Person.co nstructor:function Function(){native code}Person.prototype:[object Object]
person.com nstructor:function Person(name,sex){this.name=name;this.sex=sex;}person.prototype:undefined
Functionと同様に、Number()はNumberオブジェクトのコンストラクタであり、Number()はそのパラメータを数字numberタイプに変換し、変換結果を返します.
JavaScriptではconstructorの使用が少なく、variable.com nstructorはオブジェクト類の構造関数の文字列表現を返します.
じゃ、JavaScriptでデータの種類を判断する場合、以下の方法で詳細なデータの種類を得ることができます.
if((typeof a==object)&(a.com nstructor==Aray){
注意:constructorは既存の変数しか判断できません.typeofは未宣言変数または空のオブジェクトを判断します.