41

この式から出るようにブーリアンにしたい

(task === undefined);

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

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

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

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

4

2 に答える 2

75

これを使って:

(typeof task === "undefined")

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

于 2012-07-08T02:44:31.103 に答える
11

JavaScriptコンソールで自分で試すことができるいくつかの例でなぜそれが機能しないのかを理解するために、受け入れられた回答への補遺。

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

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

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

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

typeofこれが、代わりにソリューションを使用する必要がある理由です。これは、エラーをスローする (および JavaScript コードの実行を中断する) ことなく、すべてのケースで機能するためです。

// 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

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

于 2012-10-23T09:34:32.597 に答える