1. ホーム
  2. ジャバスクリプト

[解決済み】変数をundefinedに設定したり、引数にundefinedを渡すことはできますか?

2022-03-26 11:58:07

質問

JavaScriptの undefinednull の値を指定します。

とは何ですか? if (!testvar) は実際に何をするのでしょうか?それは undefinednull または単に undefined ?

一度定義した変数を、再びクリアして undefined (したがって、その変数を削除する)?

を渡すことはできますか? undefined をパラメータとして使用できますか?例

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");

解決方法は?

<ブロッククオート

Javascriptのundefined & nullについて少し混乱しています。

null は、他のスクリプト言語の帯域外の 'null', 'nil', 'None' オブジェクトの概念と似たような動作をします。

undefined 一方、JavaScriptは奇妙な癖があります。これは帯域外値を表すシングルトンオブジェクトで、本質的には2つ目の似て非なるものである。 null . 出てくるんですよ。

  1. の引数リストより少ない引数で関数を呼び出した場合、その関数の実行はできません。 function 文のリストで、パスされていない引数は undefined . このテストは、例えば...で行うことができます。

    function dosomething(arg1, arg2) {
        if (arg2===undefined)
        arg2= DEFAULT_VALUE_FOR_ARG2;
        ...
    }
    
    

    この方式では dosomething(1)dosomething(1, undefined) ; arg2 はどちらも同じ値になります。もし、違いを見分ける必要がある場合は arguments.length しかし、このようなオプションの引数は、一般的にあまり読みやすいものではありません。

  2. 関数が return value; を返します。 undefined . 一般に、このような戻り結果を使用する必要はありません。

  3. を持たせて変数を宣言した場合 var a ステートメントをブロック内で使用し、まだ値を代入していない場合、それは undefined . 繰り返しになりますが、これに頼る必要はないでしょう。

  4. 不気味な typeof 演算子が返す 'undefined' オペランドが存在しない単純な変数である場合、それを参照しようとすると通常起こるようなエラーを投げるのではなく、その変数を参照します。(括弧でくくられた単純な変数を指定することもできますが、その場合は ではなく は、存在しない変数を含む完全な式です)。これもあまり意味がない。

  5. これは賛否両論ありますね。存在しないオブジェクトのプロパティにアクセスしても、他の言語のようにすぐにエラーになることはない。その代わりに undefined オブジェクトを作成します。(そしてその undefined オブジェクトは、スクリプトの後のほうで、JavaScriptがただエラーをすぐに投げるよりも、追跡するのがずっと難しい奇妙な方法で失敗します)。

    これは、プロパティの存在を確認するためによく使われます。

    if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
       ...do something...
    
    

    しかし undefined を他の値と同様に使用することができます。

    o.prop= undefined;
    
    

    というのは、プロパティがそこにあるかどうかを実際には確実に検出できないからです。それよりも in 演算子は、オリジナルのNetscape版JavaScriptにはなかったのですが、今ではどこでも使えるようになっています。

    if ('prop' in o)
        ...
    
    

まとめると undefined はJavaScript特有の混乱で、みんなを混乱させています。オプションの関数引数は別として、JSには他にもっとエレガントなメカニズムがないのです。 undefined は避けるべきでしょう。この言語には決して含まれるべきではなかったのです。 null は、(2)と(3)はうまくいったでしょうし、(4)は、当初JavaScriptには例外がなかったからこそ存在する誤機能です。

<ブロッククオート

とは if (!testvar) は実際に何をするのでしょうか?未定義やNULLをテストするのでしょうか、それとも未定義だけなのでしょうか?

このような「真実性」テストは、次のようなものをチェックします。 false , undefined , null , 0 , NaN と空文字列があります。しかし、この場合、そう、本当に undefined が関係する。IMOは、そのことをもっと明確にし、次のように言うべきでしょう。 if (testvar!==undefined) .

一旦定義した変数を未定義に戻す(つまり変数を削除する)ことはできますか?

を確実に割り当てることができます。 undefined を追加しても、その変数が削除されることはありません。ただ delete object.property 演算子で本当に削除してしまいます。

delete は、変数というよりむしろプロパティに使うものです。ブラウザは、ストレートな delete variable しかし、これは良いアイデアではなく、ECMAScript 第 5 版のストリクトモードでは動作しません。もし何かへの参照を解放してガベージコレクトできるようにしたいのであれば、より一般的なのは variable= null .

パラメータとしてundefinedを渡すことはできますか?

はい。