JavaScript オブジェクトが存在するかどうかを判断する方法はたくさんありますが、JavaScript 言語の実装の詳細をよく理解している場合にのみ、JavaScript オブジェクトが存在するかどうかを判断する 10 の方法を見てみましょう。
JavaScript 言語の設計は十分に厳密ではないため、注意しないと多くのことが問題になります。
たとえば、次の状況を考えてください。
次に、グローバル オブジェクト myObj が存在するかどうかを判断する必要があります。言語で説明されているアルゴリズムは次のとおりです:
if (myObj doesn't own) { destroy myObj; }
このコードを書くのは簡単だと思うかもしれません。 Juriy Zaytsev 氏は、JavaScript オブジェクトが存在するかどうかを判断するには、JavaScript 言語の実装の詳細をよく理解している場合にのみ、50 以上の記述方法があると指摘しました。
最初の書き方
直感的には次のように書けると思うかもしれません:
if (!myObj)
{ myObj = { }
ただし、このコードを実行すると、ブラウザはReferenceError エラーが直接スローされ、操作が中断されます。エラーは何ですか?
ちなみに、if 文で myObj が空かどうかを判定する際、変数がまだ存在しない場合はエラーが報告されます。
if (!myObj)
{ var myObj = と変更すると正常に実行されます。 { }; }
var を追加してもエラーが出ないのはなぜですか?この場合、if文が判断する時点でmyObjはすでに存在しているのでしょうか?
この質問に答えるには、JavaScript インタープリタがどのように機能するかを知る必要があります。JavaScript 言語は、解析中に変数宣言が完了します。 (!myObj )
{ var myObj = { }; }
したがって、if ステートメントが判断を行うとき、myObj はすでに存在しており、これが var コマンドの「コード巻き上げ」効果です。 Javascript インタープリタのみ " var コマンドで定義された変数のプロモートは、var コマンドを使用せずに直接割り当てられた変数には機能しません。これが、var を追加しないとエラーが報告される理由です。
2 番目の書き方
。 var コマンドに加えて、これを書き換える別の方法もあります。次のようにすることでも正しい結果を得ることができます。
if (!window.myObj)
{ myObj = { }; window は JavaScript のトップレベル オブジェクトです。すべてのグローバル変数はそのプロパティです。myobj が空かどうかを判断します。これは、myObj が定義されていない場合の ReferenceError エラーを回避するために、ウィンドウ オブジェクトに myobj 属性があるかどうかを判断するために使用されます。コードの 2 行目に var:
if (!window.myObj)
を追加することをお勧めします。 または、次のように記述します:
if (!window.myObj)
{ window.myObj = { }; }
3 番目の書き方
上記の書き方の欠点は、一部のオペレーティング環境 (V8、Rhino など) では window が最上位オブジェクトにならない可能性があることです。書き直すことを検討してください。のように:
if (!this.myObj)
{ this.myObj = { }; }
グローバル変数のレベルでは、this キーワードは常に最上位の変数を指し、さまざまな操作から独立できます。環境
4 番目の書き方
ただし、上記の書き方は変数であり、さらに書き直すとエラーが発生しやすくなります。 myObj = { }; }
トップレベルのオブジェクトを表すためにカスタム変数 global を使用すると、より明確になります。
5 番目の書き方
myObj が定義されているかどうかを判断するために typeof 演算子を使用することもできます。 (typeof myObj == "unknown")
{ var myObj = { }; }
これは、JavaScript オブジェクトが存在するかどうかを判断するために現在最も広く使用されているメソッドです。
定義されているが割り当てられていない場合の 6 番目の記述方法です。上のように、myObj の値は unknown に直接等しくなります。 記述方法は次のように簡略化できます。
if (myObj == unknown)
{ var myObj = { };
ここで var キーワードに注意する必要があります。 2 番目の行は省略できません。省略すると ReferenceError エラーが発生します。次に、unknown は単一引用符や二重引用符を追加できません。ここで比較されるのは、文字列「未定義」ではなく、データ型です。上記の書き方は、「完全な比較」(===) の場合でも機能します。 確立された:
if (myObj === unknown)
{ var myObj = { } }
8 番目の書き方
によれば、 JavaScript の言語設計では、unknown == null を使用して、myObj が null に等しいかどうかを比較し、正しい結果を取得することもできます。
if (myObj == null)
{ var myObj = { }
ただし、結果は正しいですが、意味的に言えば、この判断方法は間違っているため、避けるべきです。 Null は、null の値が割り当てられているものを指します。 空のオブジェクトは、このオブジェクトが実際に値を持っていることを意味します。一方、未定義は、値を持たないオブジェクトを指します。したがって、ここでは「比較演算子」(==) のみを使用できます。「完全な比較演算子」(===) を使用すると、エラーが発生します。 in 演算子を使用して、myObj が最上位オブジェクトの属性であるかどうかを判断することもできます。
if (! ('myObj' in window))
{ window.myObj = { };書き込むには、hasOwnProperty メソッドを使用して、myObj が最上位オブジェクトのプロパティであるかどうかを判断します。
if (! this.hasOwnProperty ('myObj'))
{ this.myObj = { }; 概要 1.オブジェクトが存在するかどうかだけを判断する場合は、5 番目の書き方を使用することをお勧めします。
2. オブジェクトが存在するかどうかに加えて、オブジェクトが null 値を持つかどうかも判断する必要がある場合は、1 番目の書き方を使用することをお勧めします。
3. 特別な事情がない限り、すべての変数は var コマンドを使用して宣言する必要があります。
クロスプラットフォームであるために、最上位オブジェクトを表すために window を使用することは避けることをお勧めします。 5. Javascript 言語では、null と unknown が同時に関係する可能性があるため、混同しやすいため、「完全比較」演算子 (===) を使用することをお勧めします。