typeofとinstance of

5160 ワード

JavaScriptのtypeofとinstance ofは、変数が空かどうかを判断するためによく使われます.しかし、それらの間には違いがあります.
typeof
typeofは1元演算で、1つの演算数の前に置くと、演算数は任意の種類であります.
この戻り値は演算数の種類を示す文字列です.typeofは普通次のような結果しか返ってこないです.
number、bootlean、string、function、object、undefined.私たちはtypeofを使用して、if(typeof a)=「undefined」のような変数が存在するかどうかを取得します.alert(「ok」)」の代わりに、if(a)を使用しないでください.aが存在しないとエラーが発生しますので、Aray、Nullなどの特殊なオブジェクトに対してtype ofを使ってすべてobjectに戻ります.これはtypeofの限界です.
文字列タイプの場合、typeofはstringを返します.例えば、typeof(123)が返した値はstringです. 三、ブールタイプに対して、typeofが返した値はブーメランです.たとえばtypeof(true)が返した値はboleanです.四、オブジェクト、配列、nullに対して返した値は、objectです.例えばtypeof(window)、typeof(document)、typeof(null)が返した値はすべてobjectです.五、関数の種類に対して、戻り値はfunctionです.例えば、typeof(eval)、typeof(Date)の戻り値は、いずれもfunctionです.六、演算数が定義されていない場合(例えば、存在しない変数、関数またはundefined)は、undefinedに戻ります.例えば、typeof(ss)、typeof(undefined)はundefinedに戻ります.( 注意:初期化されていない、未宣言 typoefはundefinedに戻ります.
 
オブジェクトが配列であるかどうかを取得したい場合、または変数がオブジェクトであるかを判断する場合は、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メソッドが有用である.
1、対象のobjはnew Costructorによって作成されました. obj instance of Costructor trueのために
1
2
3
4
5
6function  Person(n, a) {    this.name = n;    this.age = a;}var  p = new  Person('John Backus', 82);console.log(p instanceof  Person); // true 
2、継承関係があるなら、 サブクラスインスタンスinstance of親クラス trueにも戻ります
1
2
3
4
5
6function  A(){}function  B(){}B.prototype = new  A(); // B A  var  b = new  B();console.log(b instanceof  A); // true 
3、Objectはルートであるため、他のカスタムクラスはすべてそれに継承されています. 任意のコンストラクタの例instance of Object すべてtrueに戻ります
1
2
3
4
5
6
7
8
9function  A() {}var  a = new  A();console.log(a instanceof  Object); // true  var  str = new  String('hello');console.log(str instanceof  Object); // true  var  num = new  Number(1);console.log(num instanceof  Object); // trueコンストラクタ自体も含まれています.
1
2
3
4function  A() {}console.log(A instanceof  Object); // trueconsole.log(String instanceof  Object); // trueconsole.log(Number instanceof  Object); // true 
4、すべてのコンストラクタinstance of Function trueに戻る
1
2
3
4function  A() {}console.log(A instanceof  Function); // trueconsole.log(String instanceof  Function); // trueconsole.log(Number instanceof  Function); // true 
以上の4つのポイントをまとめて、あるインスタンスがあるクラスまたはそのサブクラスを通じて作成された場合、instance ofはtrueに戻ります.あるいはある構造関数のプロトタイプがオブジェクトobjの内部プロトタイプチェーン上に存在すると、trueに戻ります.つまりinstance ofの結果は、コンストラクタ自体と直接関係がありません.これは多くの言語で通用します.
  // function  A(){}function  B(){}A.prototype = B.prototype = {a: 1};  // var  a = new  A();var  b = new  B();console.log(a instanceof  B); // trueconsole.log(b instanceof  A); // trueaを見ましたが、bはAとBで作成されましたが、a instance of Bと b instance of Aは全部trueです.つまり、aはコンストラクタBで作成されたものではないが、依然としてtrueに戻る.B.prototypeはaの内部プロトタイプチェーンに存在するためです.
 
JSの動的言語特性により、運転時にプロトタイプを修正することができますので、次のfalseに戻るのも珍しくありません.A.prototypeはすでにaの内部原型チェーンにないため、チェーンが中断されました.
1
2
3
4function  A(){}var  a = new  A();A.prototype = {}; // , a console.log(a instanceof  A); // false