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