JavaScriptundefined
とnull
値について少し混乱しています。
は実際には何if (!testvar)
をするのでしょうか? および をテストするのでしょうかundefined
、null
それとも だけでしょうかundefined
?
変数を定義したら、それをクリアしてundefined
(つまり変数を削除して)戻すことはできますか?
undefined
パラメータとして渡すことはできますか? 例:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
ベストアンサー1
Javascript の undefined と null について少し混乱しています。
null
一般的に、他のスクリプト言語の帯域外の「null」、「nil」、または「None」オブジェクトの概念と同様に動作します。
undefined
一方、 は奇妙な JavaScript の癖です。これは帯域外の値を表すシングルトン オブジェクトであり、本質的には 2 番目の類似しているが異なる ですnull
。次のようになります。
ステートメント リスト内の引数リストよりも少ない引数で関数を呼び出すと
function
、渡されなかった引数は に設定されますundefined
。これは次のようにしてテストできます。function dosomething(arg1, arg2) { if (arg2===undefined) arg2= DEFAULT_VALUE_FOR_ARG2; ... }
この方法では、
dosomething(1)
との違いがわかりませんdosomething(1, undefined)
。arg2
は両方とも同じ値になります。 の違いを確認する必要がある場合は を確認できますarguments.length
が、そのようにオプションの引数を使用すると、一般的に読みにくくなります。関数に がない場合
return value;
、 が返されますundefined
。通常、このような戻り結果を使用する必要はありません。var a
ブロック内にステートメントを置いて変数を宣言したが、まだ値を割り当てていない場合は、 になりますundefined
。繰り返しますが、これに頼る必要はまったくありません。不気味な
typeof
演算子は、'undefined'
オペランドが存在しない単純な変数である場合に、参照しようとした場合に通常発生するエラーをスローするのではなく、戻り値を返します。(括弧で囲まれた単純な変数を指定することもできますが、存在しない変数を含む完全な式を指定することはできません。) これもあまり役に立ちません。これは議論の余地のあるものです。存在しないオブジェクトのプロパティにアクセスしても、他の言語のようにすぐにエラーが発生することはありません。代わりにオブジェクトが返されます
undefined
。(その後、スクリプト内でそのオブジェクトを使用しようとすると、undefined
JavaScript がすぐにエラーをスローした場合よりも追跡がはるかに困難な奇妙な方法でエラーが発生します。)これは、プロパティの存在を確認するためによく使用されます。
if (o.prop!==undefined) // or often as truthiness test, if (o.prop) ...do something...
ただし、
undefined
他の値と同じように割り当てることができます。o.prop= undefined;
実際には、プロパティが存在するかどうかを確実に検出するわけではありません。Netscape
in
の JavaScript のオリジナル バージョンにはなかったものの、現在ではどこでも使用できる演算子を使用する方がよいでしょう。if ('prop' in o) ...
要約すると、undefined
これは JavaScript 特有の混乱で、誰もが混乱します。オプションの関数引数は別として、JS には他にもっとエレガントなメカニズムがないので、undefined
避けるべきです。これは言語の一部であるべきではありませんでした。null
(2) と (3) では問題なく機能したはずです。(4) は、JavaScript の初期に例外がなかったために生じた誤った機能です。
は実際に何
if (!testvar)
をするのでしょうか? undefined と null をテストするのでしょうか、それとも undefined だけをテストするのでしょうか?
このような「真偽」テストはfalse
、、、、および空の文字列に対してチェックします。しかし、この場合、はい、それは本当にそれが関係しているということですundefined
。私見では、それについてはもっと明確にnull
して、と言うべきです。0
NaN
undefined
if (testvar!==undefined)
変数を定義したら、それを未定義に戻す(つまり変数を削除する)ことはできますか。
確かundefined
に代入することはできますが、それでは変数は削除されません。delete object.property
演算子だけが実際に削除します。
delete
は、変数というよりもプロパティ用です。ブラウザでは を直接使用しても問題ありませんdelete variable
が、これは良い考えではなく、ECMAScript 第 5 版の厳密なモードでは機能しません。何かへの参照を解放してガベージ コレクションできるようにする場合は、 を使用する方が一般的ですvariable= null
。
undefined をパラメータとして渡すことはできますか?
はい。