この表現から抜け出すためにブール値が欲しい
(task === undefined);
ここで、task
は任意であり、コードにはまったく表示されません。
ただし、これをrhinoで実行すると、参照エラーが発生します。本当したい
なぜ私は真実にならないのですか?
特定の変数が定義されているかどうかを確認したい。これが機能しない場合はどうすればよいですか?
これを使って:
(typeof task === "undefined")
(task === undefined)
を使用する場合、Javascriptはtask
の値を見つけてundefined
と同じかどうかを確認する必要がありますが、名前が検索できないため、名前を検索できません。 tが存在し、参照エラーが発生します。 typeof
は、存在しない名前のタイプを安全に返すことができるという点で特別です。
補遺受け入れられた回答に、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
この演習が、この比較の理由を理解するのに役立つことを願っています。