変数をundefinedに設定したり、undefinedを引数として渡したりできますか?


304

JavaScript undefinednull値について少し混乱しています。

if (!testvar)実際には何をしますか?それをテストするのかundefinednullそれとも単にテストするのundefinedですか?

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

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

function test(var1, var2, var3) {

}

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

回答

回答:


514

JavaScriptが未定義で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'、そのオペランドが存在しない単純な変数である場合に、参照しようとすると通常発生するようなエラーをスローする代わりに戻ります。(また、それを括弧に包まれた、単純な変数を与えることができますが、ない非existant変数を含む完全な表現。)そのためあまり使用し、どちらか。

  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をテストしますか、それとも単に未定義ですか?

このようなA「truthiness」に対するテストをチェックfalseundefinednull0NaN、空の文字列。しかし、この場合、そうです、それは本当にundefined懸念していることです。IMO、それはそれについてより明確であると言うべきif (testvar!==undefined)です。

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

あなたは確かundefinedにそれに割り当てることができますが、それは変数を削除しません。delete object.property本当に削除するのはオペレーターだけです。

delete実際には、変数自体ではなくプロパティを対象としています。ブラウザーを使用すると、straightを使用できますdelete variableが、これはお勧めできません。ECMAScriptFifth Editionのストリクトモードでは動作しません。ガベージコレクションできるように参照を解放したい場合は、と言うのが一般的variable= nullです。

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

はい。


10
なんて素晴らしい答えでしょう。JavaScriptテストに失敗しました:perfectionkills.com/javascript-quiz 後で、あなたの回答をもう一度読んで、もう一度テストしてみます!
Skilldrick、2010

1
修正、ta。(一般的なケースでは解決できないすべてのものを台無しにするためにスクリプトが再定義できるものはたくさんあるので、私は再割り当てについてあまり心配する傾向はありません。)
bobince

2
@bobince undefinedはシングルトンオブジェクトですか?どういう意味ですか?これはプリミティブ値であり、オブジェクトではありません。
–ŠimeVidas、2011

2
@Hortitude:それがポイント(4)です。私は通常そうしませんtypeof foo=='undefined'。それは私が明示的であると言うことを好むだろうその場合、グローバル・スニッフィング(4A)のために使用される傾向にある'foo' in window、または(4B)に対して試験undefinedIは、読み取り可能と言うことを好むだろうその場合-value自体、foo===undefined。理論的には、typeofに対するテストに'undefined'は、他の構成要素では提供できないユースケースがあります。ローカル変数の存在をスニッフィングします。ただし、実際には、ローカルで宣言されている変数はほとんど常に知っています。
ボビンス、2011

4
#2の注意点の1つは、通常、returnステートメントのない関数がを返すことundefinedですが、関数がコンストラクター(new演算子で呼び出される)の場合thisreturnステートメントがないにもかかわらず、新しいオブジェクト(コンストラクター内の値)を返します。console.log((function (){}()));を返しますundefinedconsole.log((new function (){}()));オブジェクトを返します。
役に立たないコード

18

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

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

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

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

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

if(testvar === null) { ... }

1
三重等号は型もチェックするため、型強制は実行されません。Douglas Crockfordは、型強制演算子(==および!=)の使用を推奨していません。
スキルドリック

3
何かを未定義として定義できます。var a= undefined。あなたは渡すことができfn(undefined)ます。pオブジェクトの未定義のプロパティと、に定義および設定されてoいるプロパティの違いを見つけるには、演算子を使用する必要があります。pundefined'p' in o
ボビンス

1
testvar === undefinedより複雑ではなくテストすべきではない理由はありtypeof(testvar) === "undefined"ますか?
ddaa 2010

4
typeof未定義の変数のテストを使用するもう1つの理由があります。とは異なりnullundefined単にグローバルオブジェクトのプロパティであり、それ自体が再定義される場合があります。特定のコーディングスタイルと等号の欠落のみを受け取り、undefined静かに変更されます:if (undefined = someVar) {...}
ティム・ダウン

1
@IanGrainger:ECMAScript 5(すべてのブラウザーの現在のバージョンで実装されています)undefinedは、グローバルオブジェクトの不変のプロパティを作成することでこれをほぼ修正しているため、以前よりも安全です。ただし、次のような可変変数を定義することは可能です。undefined関数内でであるため、問題は完全に解消されていません。
Tim Down

13

基本的な違いは、undefinedそれnullが異なる概念を表すことです。

もしも 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;

「要約すると、未定義はJavaScript固有の混乱であり、すべてのユーザーを混乱させる」のような迷惑な発言をする人に頼るのではなく、ここのリファレンスを確認してください。混乱しているからといって、それが混乱しているという意味ではありません。

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

この動作はまた、JavaScriptに固有のものではなく、それはboolean型の結果ができることを一般概念を完了しtruefalse未知(null)、値なし(undefined)、または何かが間違っていました(error)。

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


そして、それでも nullうまくいきます。a == nullこれはtrue、JavaScriptタイプの強制型変換のためです。
sleepwalkerfx

11

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

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

未定義の場合

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

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

testVar = undefined;
//typeof(testVar) will be equal to undefined.

1
null値を確認する最善の方法は!==、ではなくを使用することです!=
MBO

6

はい、できます。undefinedはundefinedとして定義れているためです。

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true

あなたの場合:

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

独自の未定義変数を作成することもできます。

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined

5

最初の質問に答えるために、not演算子(!)は、与えられたものをすべてブール値に強制変換します。ですからnull0falseNaN及び""(空の文字列)は、すべての偽表示されます。


また、空の文字列とNaN(非数)
MBO

undefinedとして表示されずfalse、 'is not defined'エラーがスローされます。
Tatu Ulmanen

タツ・ウルマネン:そうではありません。グローバルオブジェクトのプロパティとして存在するif (undefined) {/* Do stuff*/}ため、エラーは発生しませんundefined。エラーになるのは次のようなものですif (someUndeclaredVariable) {/* Do stuff*/}
Tim Down

2

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で変数をundefinedに設定した場合:

これを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 /';、変数をundefinedに設定するたびに、その値を受け取ります。

あなたは私が最初に未定義の値のエイリアンをどのように出力し、それをまだ実行させることができるのか疑問に思うかもしれません。これは、javascriptの巻き上げによるものです。http//www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html



0

for if (something)およびif (!something)は、何かが定義されているかどうかを確認するために一般的に使用されます。例えば:

if (document.getElementById)

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

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

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


0

楽しみのために、ここに変数に「未割り当て」を割り当てるかなり安全な方法があります。これが衝突するためには、ランダムに生成された文字列とまったく同じ名前を持つオブジェクトのプロトタイプに誰かが追加する必要があります。ランダム文字列ジェネレータは改善できると確信していますが、この質問から1つだけを選びましたJavaScriptでランダムな文字列/文字を生成します

これは、新しいオブジェクトを作成し、ランダムに生成された名前でそのオブジェクトのプロパティにアクセスしようとすることで機能します。

function GenerateRandomString() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 50; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

var myVar = {}[GenerateRandomString()];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.