JavaScript がオブジェクトの存在を判断する方法のメソッド インスタンスの概要

伊谢尔伦
リリース: 2017-07-26 11:35:47
オリジナル
1414 人が閲覧しました

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 = { }; 
  }
ログイン後にコピー

先頭を表すカスタム変数globalを使用します-level オブジェクト。これはより明確です。
5 番目の書き方

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 コマンドを使用して宣言する必要があります。

4. クロスプラットフォームにするために、トップレベルのオブジェクトを表すためにウィンドウを使用しないことをお勧めします。

5. Javascript言語では、nullと未定義は混同されやすいです。両方が関係する可能性がある場合は、「完全比較」演算子 (===) を使用することをお勧めします。

以上がJavaScript がオブジェクトの存在を判断する方法のメソッド インスタンスの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート