ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptのtypeofとinstanceofの違いの紹介(コード例)

JavaScriptのtypeofとinstanceofの違いの紹介(コード例)

不言
不言転載
2019-02-25 10:25:192771ブラウズ

この記事では、JavaScript の typeof と instanceof の違いについて説明します (コード例)。必要な方は参考にしていただければ幸いです。

JavaScript の typeof と instanceof は、変数が空かどうか、またはその型を判断するためによく使用されます。しかし、それらの間にはまだ違いがあります。

typeof

typeof は単項演算であり、オペランドの前に置かれ、オペランドは任意の型にすることができます。

戻り値は、オペランドの型を説明する文字列です。 (typeof 演算子は、式のデータ型を表すために使用される文字列を返します。)

typeof は、実際には、1 つのパラメーターについて、パラメーターの型を決定するインスタンスです。次の結果のみを返します:「数値」、「文字列」、「ブール値」、「オブジェクト」、「関数」、および「未定義」。

オペランドは数値です typeof(x) = "number"

文字列 typeof(x) = "string"

ブール値 typeof(x) = "boolean"

オブジェクト、配列、null typeof(x) = "object"

Function typeof(x) = "function"

console.log(typeof (123));//typeof(123)返回"number" 
console.log(typeof ("123"));//typeof("123")返回"string"
var param1 = "string";
var param2 = new Object();
var param3 = 10;
console.log(typeof(param1)+"\n"+typeof(param2)+"\n"+typeof(param3)); 
     // string object  number

typeof を使用して変数かどうかを取得できます。 a が存在しない (宣言されていない) 場合、エラーが発生するため、if(typeof a!="unknown"){alert("ok")} などの特殊なオブジェクトが存在する場合は、if(a) を使用しないでください。配列と Null typeof を使用すると、常にオブジェクトが返されます。これは typeof の制限です。

配列は、同じ名前の複数の入力など、js でよく使用されます。配列が動的に生成される場合は、送信時にそれらが配列であるかどうかを判断する必要があります。

    if(document.mylist.length != "undefined" ) {} //这个用法有误.
    正确的是 `if( typeof(document.mylist.length) != "undefined" ) {}` 

     或 `if( !isNaN(document.mylist.length) ) {}`

typeof のオペランド。は定義ではないため、戻り値は「未定義」になります。

JavaScript では、typeof 演算子を使用して変数の型を決定します。typeof 演算子を使用する場合、参照型を使用するときに問題が発生します。参照に関係なく、値を格納します。オブジェクトの種類に関係なく、「object」を返します。これには、オブジェクトが別のオブジェクトのインスタンスであるかどうかを検出するために、instanceof が必要です。

instanceof

instanceof 演算子は、オブジェクトのプロトタイプ チェーンにコンストラクターのプロトタイプ属性があるかどうかをテストするために使用されます。

構文: objectinstanceofconstructor

パラメータ: object (検出対象のオブジェクト)constructor (コンストラクター)

説明:instanceof 演算子は、constructor.prototype がパラメータ オブジェクトに存在するかどうかを検出するために使用されます。プロトタイプチェーン。

instance: インスタンス、example

ainstanceof b?alert("true"):alert("false"); //a は b のインスタンスです? True: False

instanceof は、変数がオブジェクトのインスタンスであるかどうかを判断するために使用されます。

如 :var a=new Array();

alert(a instanceof Array); // true,

同时 alert(a instanceof Object) //也会返回 true;

这是因为 Array 是 object 的子类。



再如:function test(){};

var a=new test();

alert(a instanceof test) 会返回true

alert(a==b);  //flase

Case:

另外,更重的一点是 `instanceof` 可以在继承关系中用来判断一个实例是否属于它的父类型。

例如:

function Foo(){} 
Foo.prototype = new Aoo();//JavaScript 原型继承 
var foo = new Foo(); 
console.log(foo instanceof Foo)//true 
console.log(foo instanceof Aoo)//true

上面的代码中是判断了一层继承关系中的父类,在多层继承关系中,instanceof 运算符同样适用。


又如:

console.log(Object instanceof Object);//true 
console.log(Function instanceof Function);//true 
console.log(Number instanceof Number);//false 
console.log(String instanceof String);//false  
console.log(Function instanceof Object);//true  
console.log(Foo instanceof Function);//true 
console.log(Foo instanceof Foo);//false
// 定义构造函数
function C(){} 
function D(){} 

var o = new C();

// true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof C; 

// false,因为 D.prototype不在o的原型链上
o instanceof D; 

o instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回true
C.prototype instanceof Object // true,同上

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.

D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

instanceof について言えば、もう 1 つの質問を挿入する必要があります。これは関数 Arguments であり、引数は Array であると誰もが考えるかもしれませんが、instanceof を使用してテストすると、見た目は非常に似ていますが、arguments は Array オブジェクトではないことがわかります。

Also:

Test var a=new Array();if (オブジェクトのインスタンス)alert('Y');elsealert('N');

'Y'を取得しました

しかし、 if (オブジェクトのウィンドウインスタンス)alert('Y');elsealert('N');

got 'N'

つまり、ここで、instanceof によってテストされるオブジェクトは、dom モデル オブジェクトではなく、js 構文のオブジェクトを指します。

typeof

alert(typeof(window)) を使用すると object が取得されるため、いくつかの違いがあります。

式 obj instanceof Foo が true を返す場合、これは、Foo.prototype 属性の値が変更される可能性があり、変更された値が obj のプロトタイプ チェーンに存在しない可能性があるため、式が常に true を返すことを意味します。この場合、元の式の値が返されます。偽になる。別のケースでは、元の式の値も変更されます。つまり、オブジェクト obj のプロトタイプ チェーンが変更されます。ただし、現在の ES 仕様では、オブジェクトのプロトタイプを読み取ることはできますが、変更することはできません。非標準の __proto__ マジック プロパティの助けを借りて実現できます。たとえば、obj.__proto__ = {} を実行すると、obj instanceof Foo は false を返します。

例: String オブジェクトと Date オブジェクトがどちらも Object 型に属することを示す

次のコードでは、instanceof を使用して次のことを証明します。 String オブジェクトと Date オブジェクトも Object 型に属します。

rreeee

以上がJavaScriptのtypeofとinstanceofの違いの紹介(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。