JavaScript 言語の設計は十分に厳密ではないため、注意しないと多くの場所で間違いが発生する可能性があります。 グローバル オブジェクト myObj が存在するかどうかを判断する必要があります。存在しない場合は、それを宣言します。自然言語で記述されたアルゴリズムは次のとおりです:
if (myObj不存在){ 声明myObj; }
このコードを書くのは簡単だと思うかもしれません。しかし実際には、含まれる文法上の問題は私たちが想像するよりもはるかに複雑です。 JavaScript 言語の実装の詳細をよく理解している場合にのみ、それらの違いを見分けることができます。
最初の書き方
直感的には次のように書けると思うかもしれません:
if (!myObj) { myObj = { }; }
ただし、このコードを実行すると、ブラウザは ReferenceError エラーを直接スローし、操作が中断されます。どうしたの?
ちなみに、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 = { }; }
window は JavaScript のトップレベル オブジェクトであり、すべてのグローバル変数はその属性です。したがって、myobj が空であるかどうかを判断することは、window オブジェクトが myobj 属性を持っているかどうかを判断することと同等であるため、myObj が定義されていないために発生する ReferenceError エラーを回避できます。ただし、コードの標準化の観点から、
if (!window.myObj) { var myObj = { }; }
の 2 行目に var を追加するか、次のように記述するのが最善です: (V8、Rhino など)、window はトップレベルのオブジェクトではない可能性があります。したがって、次のように書き直すことを検討してください:
if (!window.myObj) { window.myObj = { }; }
グローバル変数のレベルでは、 this キーワードは常に最上位の変数を指すため、さまざまな動作環境に依存することができません。
4番目の書き方
if (!this.myObj) { this.myObj = { }; }
typeof 演算子を使用して、myObj が定義されているかどうかを判断することもできます。
var global = this; if (!global.myObj) { global.myObj = { }; }
これは、JavaScript オブジェクトが存在するかどうかを確認するために現在最も広く使用されている方法です。
6番目の書き方
myObjの値は、定義されていても代入されていない状態では、そのままunknownに等しいため、上記の書き方を簡略化できます:
if (typeof myObj == "undefined") { var myObj = { }; }
ここで注意すべき箇所は2つあります。とりわけ、2 行目 var キーワードを省略することはできません。省略すると ReferenceError が発生します。次に、ここでは文字列 "unknown" ではなく、unknown のデータ型が比較されるため、単一引用符または二重引用符を unknown に追加することはできません。
第7の書き方
上記の書き方は「完全比較」(===)の場合にも当てはまります:
if (myObj == undefined) { var myObj = { }; }
第8の書き方
JavaScriptの言語設計による、未定義 == null、したがって、myObj が null に等しいかどうかを比較することでも、正しい結果を得ることができます:
if (myObj === undefined) { var myObj = { }; }
ただし、実行結果は正しくても、意味的に言えば、この判断方法は間違っているため、避けるべきです。 null は、null の値が割り当てられた空のオブジェクトを指します。つまり、このオブジェクトには実際に値があります。一方、未定義は、存在しないか、値が割り当てられていないオブジェクトを指します。したがって、ここで使用できるのは「比較演算子」(==) のみです。「完全比較演算子」(===) を使用するとエラーが発生します。
9番目の書き方
in演算子を使用して、myObjが最上位オブジェクトのプロパティであるかどうかを判断することもできます:
if (myObj == null) { var myObj = { }; }
10番目の書き方
最後に、hasOwnPropertyメソッドを使用して判断します。 myObj が最上位オブジェクトのプロパティであるかどうか 属性:
if (!('myObj' in window)) { window.myObj = { }; }
Summary
1 オブジェクトが存在するかどうかだけを判断する場合は、5 番目の記述方法を使用することをお勧めします。 2. オブジェクトが存在するかどうかに加えて、オブジェクトが null 値を持つかどうかも判断する必要がある場合は、最初の記述方法を使用することをお勧めします。
3. 特別な事情がない限り、すべての変数は var コマンドを使用して宣言する必要があります。
以上がJavaScript がオブジェクトの存在を判断する方法のメソッド インスタンスの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。