330

undefinedJavaScriptとnull値について少し混乱しています。

実際には何をしif (!testvar)ますか?undefinedそれはandnullまたは justをテストしundefinedますか?

変数が定義されたら、それをクリアして戻すことはできますundefinedか (したがって、変数を削除します)?

undefinedパラメータとして渡すことはできますか? 例えば:

function test(var1, var2, var3) {

}

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

10 に答える 10

553

Javascriptの未定義とnullについて少し混乱しています。

null通常、帯域外の「null」、「nil」、または「None」オブジェクトの他のスクリプト言語の概念と同様に動作します。

undefined一方、は奇妙な JavaScript の癖です。これは帯域外の値を表すシングルトン オブジェクトであり、基本的には 2 番目の similar-but-differentnullです。出てきます:

  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. spooky演算子は、そのオペランドが存在しない単純な変数である場合にtypeof戻ります。参照しようとした場合に通常発生するエラーをスローするのではありません。'undefined'(括弧で囲まれた単純な変数を指定することもできますが、存在しない変数を含む完全な式を指定することはできません。) それもあまり役に立ちません。

  5. これは物議を醸すものです。存在しないオブジェクトのプロパティにアクセスしても、他のすべての言語のようにすぐにエラーになることはありません。代わりに、undefinedオブジェクトを取得します。(そして、undefined後でスクリプトでそのオブジェクトを使用しようとすると、JavaScript がすぐにエラーをスローした場合よりも追跡がはるかに困難な奇妙な方法で問題が発生します。)

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

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

    undefinedただし、他の値と同じように割り当てることができるため:

    o.prop= undefined;
    

    プロパティが確実に存在するかどうかを実際には検出しません。inJavaScript の元の Netscape バージョンにはありませんでしたが、現在はどこでも使用できる演算子を使用することをお勧めします。

    if ('prop' in o)
        ...
    

要約すると、undefinedこれは JavaScript 固有の混乱であり、誰もが混乱します。オプションの関数引数は別として、JS には他に洗練されたメカニズムがないため、これundefinedは避けるべきです。それは決して言語の一部であってはなりません。null(2) と (3) については問題なく動作し、(4) は最初は JavaScript に例外がなかったためにのみ存在する誤機能です。

実際には何をしif (!testvar)ますか?未定義とnullまたは未定義のみをテストしますか?

このような「真実性」テストは、、、、、および空の文字列に対してfalseチェックします。しかし、この場合、そうです、それは本当に関係しています。IMO、それについてもっと明確にして、.undefinednull0NaNundefinedif (testvar!==undefined)

変数が定義されたら、それをクリアして未定義に戻すことができます(したがって、変数を削除します)。

確かに代入できますがundefined、変数は削除されません。delete object.property実際に物を取り除くのはオペレーターだけです。

delete変数自体ではなく、実際にはプロパティを対象としています。ブラウザーは Straight を使用できますがdelete variable、これは良い考えではなく、ECMAScript 第 5 版の厳密モードでは機能しません。何かへの参照を解放してガベージ コレクションできるようにする場合は、variable= null.

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

はい。

于 2010-02-10T10:53:53.780 に答える
23

変数は未定義ではなくなるため、何かを未定義として定義することはできません (すべきではありませんか?)。変数を何かに定義しただけです。

undefined関数に渡すことはできません (すべきではありませんか?) 。空の値を渡したい場合は、null代わりに使用してください。

このステートメントif(!testvar)はブール値の true/false 値をチェックしtestvarますfalse。定義上、nullandはまたはundefinedとして評価されるべきではありませんが、JavaScript は として評価され、未定義の変数を評価しようとするとエラーが発生します。truefalsenullfalse

undefinedまたはを適切にテストするにはnull、次を使用します。

if(typeof(testvar) === "undefined") { ... }

if(testvar === null) { ... }
于 2010-02-10T09:24:45.707 に答える
18

基本的な違いは、undefinednullが異なる概念を表していることです。

のみnullが利用可能な場合、null面倒なエラーキャッチを使用しない限り、意図的に値として設定されているのか、値がまだ設定されていないのかを判断できません。

var a;

a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;

ただし、値を意図的に に設定するとnull、 との厳密な等価性が失敗するため、との値undefinedを区別できます。nullundefined

var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;

「要約すると、undefined は JavaScript 固有の混乱であり、誰もが混乱する」などのがらくたを否定的に言う人々に頼るのではなく、こちらのリファレンスを確認してください。混乱しているからといって、混乱しているわけではありません。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

この動作も JavaScript に固有のものではなく、ブール値の結果がtruefalse、不明 ( null)、値なし ( undefined)、または問題が発生した ( error) であるという一般化された概念を完成させます。

http://en.wikipedia.org/wiki/Undefined_value

于 2014-10-05T03:37:03.790 に答える
14

null 値を確認する最良の方法は、

if ( testVar !== null )
{
    // do action here
}

および未定義の場合

if ( testVar !== undefined )
{
    // do action here
}

未定義の変数を割り当てることができます。

testVar = undefined;
//typeof(testVar) will be equal to undefined.
于 2010-02-10T09:24:01.797 に答える
6

最初の質問に答えるために、not 演算子 ( !) は、与えられたものをブール値に強制します。したがって、、、、nullおよび(空0の文字列) はすべて false に表示されます。falseNaN""

于 2010-02-10T09:23:00.263 に答える
4

JavaScript、コマンドラインで変数を未定義に設定する方法:

jsUbuntu 12.10 の Java に付属する javascript コマンド ライン ターミナルで変数を undefined に設定します。

el@defiant ~ $ js

js> typeof boo
"undefined"

js> boo
typein:2: ReferenceError: boo is not defined

js> boo=5
5

js> typeof boo
"number"

js> delete(boo)
true

js> typeof boo
"undefined"

js> boo
typein:7: ReferenceError: boo is not defined

JavaScript で変数を未定義に設定した場合:

これを myjs.html に入れます:

<html>
<body>
    <script type="text/JavaScript">
        document.write("aliens: " + aliens);
        document.write("typeof aliens: " + (typeof aliens));
        var aliens = "scramble the nimitz";
        document.write("found some aliens: " + (typeof aliens));
        document.write("not sayings its aliens but... " + aliens);
        aliens = undefined;
        document.write("aliens deleted");
        document.write("typeof aliens: " + (typeof aliens));
        document.write("you sure they are gone? " + aliens);
    </script>
</body>
</html>

これを出力します:

aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined

警告!変数を未定義に設定すると、変数が別の変数に設定されます。卑劣な人が走っundefined = 'rm -rf /';た場合、変数を未定義に設定するたびに、その値を受け取ります。

最初に未定義の値エイリアンを出力し、それを実行できるようにする方法を疑問に思われるかもしれません。これは、javascript ホイストが原因です: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

于 2014-01-08T18:51:11.047 に答える
1

forif (something)if (!something)は一般に、何かが定義されているか定義されていないかを確認するために使用されます。例えば:

if (document.getElementById)

識別子はブール値に変換されるため、undefinedとして解釈されfalseます。もちろん、 として解釈される他の値 (0 や '' など) もありfalseますが、識別子にそのような値が合理的に含まれていないか、そのような値を undefined と同じように扱って問題ありません。

Javascript にはdelete、オブジェクトのメンバーを削除するために使用できる演算子があります。変数のスコープ (グローバルかどうか) に応じて、変数を削除して未定義にすることができます。

undefined未定義のリテラルとして使用できるキーワードはありません。関数呼び出しでパラメーターを省略して未定義にすることはできますが、それは関数に送信するパラメーターが少ない場合にのみ使用でき、途中でパラメーターを省略できません。

于 2010-02-10T09:41:46.907 に答える