web-dev-qa-db-ja.com

参照エラーを取得せずに、存在しないJavaScriptオブジェクトを未定義と比較するにはどうすればよいですか?

この表現から抜け出すためにブール値が欲しい

(task === undefined);

ここで、taskは任意であり、コードにはまったく表示されません。

ただし、これをrhinoで実行すると、参照エラーが発生します。本当したい

なぜ私は真実にならないのですか?

特定の変数が定義されているかどうかを確認したい。これが機能しない場合はどうすればよいですか?

33
Fawkes5

これを使って:

(typeof task === "undefined")

(task === undefined)を使用する場合、Javascriptはtaskの値を見つけてundefinedと同じかどうかを確認する必要がありますが、名前が検索できないため、名前を検索できません。 tが存在し、参照エラーが発生します。 typeofは、存在しない名前のタイプを安全に返すことができるという点で特別です。

63
Ned Batchelder

補遺受け入れられた回答に、JavaScriptコンソールで試してみることができるいくつかの例で機能しない理由を理解してください。

未定義の型と直接比較することは、変数が存在する場合にのみ機能します。以下は、Google Chromeブラウザから取得する出力です:

> task === undefined
  ReferenceError: task is not defined

ただし、変数が存在するの場合は機能します:

// continued from above
> var task
  undefined
> task === undefined
  true

これが、代わりにtypeofソリューションを使用する必要がある理由です。これは、エラーをスローせずに(およびjavascriptコードの実行を中断せずに)allの場合に機能するためです。

// continued from above
> typeof notavariable === 'undefined'
  true
> typeof task === 'undefined'
  true

オブジェクトリテラルのプロパティなど、場合によってはtypeofチェックが必要ないことに注意してください。

// continued from above
> var obj = {}
  undefined
> obj.test === undefined
  true
> obj.test = 1
  1
> obj.test === undefined
  false

これは、オブジェクトのプロパティが連想配列の値のように動作するためです。

// continued from above
> obj["test"]
  1
> obj["test"] === undefined
  false

ただし、これが引数入力を制御できない関数の場合であると常に確信できるとは限りません。

// continued from above
> function TestFunc(arg1) { console.log(arg1) }
  undefined
> TestFunc(notavariable)
  ReferenceError: notavariable is not defined
> TestFunc(task)
  undefined
  undefined
> TestFunc(obj["lol"])
  undefined
  undefined

この演習が、この比較の理由を理解するのに役立つことを願っています。

9
Spoike