JavaScript言語のデザインは十分に厳密ではなく、注意しないと多くの場所が間違いを犯します。
たとえば、次の状況を検討してください。
ここで、グローバルオブジェクトMyoBJが存在するかどうか、およびそれが存在しない場合は宣言する必要があります。自然言語で説明されているアルゴリズムは次のとおりです。
if(myobjは存在しません){myobjを宣言します。 }このコードを簡単に書き込むことができます。しかし、実際には、それが関与する文法的な問題は、私たちが思っているよりもはるかに複雑です。 Juriy Zaytsevは、JavaScriptオブジェクトが存在するかどうかを判断するには50を超える方法があると指摘しました。 JavaScript言語の実装の詳細が非常に明確である場合にのみ、それらを区別できます。
最初に書く方法
あなたの直感に基づいて、あなたはこれを書くことができると思うかもしれません:
if(!myobj){myobj = {}; }ただし、このコードを実行すると、ブラウザはリファレンスエラーエラーを直接スローし、操作を中断します。どうしたの?
ちなみに、IFステートメントがMyOBJが空であるかどうかを決定すると、この変数はまだ存在しないため、エラーが報告されます。次のように変更すると、正しく実行されます。
if(!myobj){var myobj = {}; }VARを追加した後、なぜエラーが報告されないのですか? IFステートメントが判断を下すこの場合、MYOBJはすでに存在しますか?
この質問に答えるには、JavaScriptインタープリターがどのように機能するかを知る必要があります。 JavaScript言語は「最初に解析、後で実行」です。変数宣言は解析中に完了するため、上記のコードは実際に次のものと同等です。
var myobj; if(!myobj){var myobj = {}; }したがって、IFステートメントが判断を下す場合、MyOBJが存在するため、エラーはありません。これは、VARコマンドの「コード強化」効果です。 JavaScriptインタープリターは、VARコマンドによって定義された変数のみを「昇格」し、VARコマンドを使用して直接割り当てない変数では機能しません。これが、varを追加しないとエラーを引き起こす理由です。
書く2番目の方法
VARコマンドに加えて、別の書き換えがあり、正しい結果を得ることができます。
if(!window.myobj){myobj = {}; }ウィンドウはJavaScriptのトップレベルのオブジェクトであり、すべてのグローバル変数はそのプロパティです。したがって、MyOBJが空であるかどうかを判断することは、MyOBJが定義されていないためリファレンスエラーエラーを回避するために、ウィンドウオブジェクトにMyoBJ属性があるかどうかを判断することと同等です。ただし、コードの標準化から、VARを2行目に追加することをお勧めします。
if(!window.myobj){var myobj = {}; }または次のように書いてください:
if(!window.myobj){window.myobj = {}; }書くための3番目の方法
上記の執筆方法の欠点は、一部の動作環境(V8やRhinoなど)では、ウィンドウがトップレベルのオブジェクトではない可能性があることです。したがって、それを書き換えることを次のように考えてみてください。
if(!this.myobj){this.myobj = {}; }グローバル変数レベルでは、このキーワードは常にトップレベルの変数を指しているため、さまざまなオペレーティング環境から独立している可能性があります。
書くための4番目の方法
ただし、上記の執筆の読み取りは不十分であり、これの指摘は可変でエラーが発生しやすいため、さらに書き直されます。
var global = this; if(!global.myobj){global.myobj = {}; }カスタム変数グローバルを使用して、トップレベルのオブジェクトを表すことははるかに明確です。
書くための5番目の方法
Typeofオペレーターを使用して、MyOBJが定義されているかどうかを判断することもできます。
if(typeof myobj == "undefined"){var myobj = {}; }これは、JavaScriptオブジェクトが存在するかどうかを判断するために最も広く使用されている方法です。
6番目に書く方法
MyoBJの値は、定義されているが割り当てられていない場合には未定義に直接等しいため、上記の書き込み方法は簡素化できます。
if(myobj == undefined){var myobj = {}; }ここには2つの場所があります。まず、2行目のVARキーワードが欠落してはならないため、参照エラーエラーが発生します。第二に、「未定義」の文字列ではなく、ここでは未定義のデータ型がここで比較されるため、未定義を単一または二重引用符で追加することはできません。
書く7番目の方法
上記の執筆方法は、「正確な比較」(===)の条件下でまだ有効です。
if(myobj === undefined){var myobj = {}; }書く8番目の方法
JavaScriptの言語設計によると、未定義== nullなので、MyoBJがnullに等しいかどうかを比較することで、正しい結果を得ることができます。
if(myobj == null){var myobj = {}; }ただし、操作結果は正しいですが、意味的には、この判断方法は間違っており、避けるべきです。 nullはnullに割り当てられた空のオブジェクトを指すため、つまり、このオブジェクトは実際に評価されますが、未定義は存在しない、または割り当てがないオブジェクトを指します。したがって、ここでは「オペレーターの比較」(==)のみを使用できます。ここで「正確な比較演算子」(===)を使用すると、エラーが発生します。
書くための9番目の方法
また、in operatorを使用して、MyoBJがトップレベルオブジェクトの属性であるかどうかを判断することもできます。
if(!( 'myobj' in window)){window.myobj = {}; }書くための10番目の方法
最後に、HasownPropertyメソッドを使用して、MyOBJがトップレベルオブジェクトの特性であるかどうかを判断します。
if(!this.hasownproperty( 'myobj')){this.myobj = {}; }要約します
1.オブジェクトが存在するかどうかのみを決定する場合は、5番目の書き込み方法を使用することをお勧めします。
2。オブジェクトが存在するかどうかに加えて、オブジェクトにヌル値があるかどうかを判断することも必要です。最初の書き込み方法を使用することをお勧めします。
3.特に指定がない限り、すべての変数はVARコマンドを使用して宣言する必要があります。
4。クロスプラットフォームの場合、トップレベルのオブジェクトを表すためにウィンドウを使用しないようにすることをお勧めします。
5。JavaScript言語では、nullと未定義は混乱を招く傾向があります。両方が関与している場合は、「正確な比較」演算子(===)を使用することをお勧めします。
(以上)
JavaScriptオブジェクトが存在するかどうかを判断する方法の上記の簡単な例は、私があなたと共有したすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。