web-dev-qa-db-ja.com

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

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

if (!testvar)は実際に何をしますか?それはundefinedおよびnull、あるいは単にundefinedをテストしますか。

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

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

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");
283
AJ.

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'を返します。参照しようとした場合に通常発生するエラーをスローするのではありません。 (括弧で囲まれた単純な変数を指定することもできますが、not存在しない変数を含む完全な式を指定することもできます)。

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

    これはしばしばプロパティの存在をチェックするために使われます。

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

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

    o.prop= undefined;
    

    それは実際に特性が確実にそこにあるかどうかを検出しません。 in演算子を使用するほうが良いでしょう。これは、JavaScriptのオリジナルのNetscapeバージョンにはありませんでしたが、現在はどこでも利用可能です。

    if ('prop' in o)
        ...
    

まとめると、undefinedはJavaScript固有の混乱です。オプションの関数引数を除けば、JSにはこれ以上洗練されたメカニズムはありませんが、undefinedは避けるべきです。それは決して言語の一部ではなかったはずです。 nullは、(2)と(3)では問題なく動作していました。(4)は、当初JavaScriptに例外がなかったために存在しただけの間違いです。

if (!testvar)は実際に何をしているのですか?未定義とnull、または未定義かをテストしますか。

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

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

undefinedを確実に代入することはできますが、それによって変数が削除されることはありません。 delete object.property演算子だけが本当に物事を取り除きます。

deleteは、実際は変数ではなくプロパティを対象としています。ブラウザを使えばdelete variableをそのまま使うことができますが、これはお勧めできません。ECMAScriptの第5版の厳密モードでは動作しません。何かへの参照を解放してガベージコレクションができるようにしたい場合は、variable= nullと言うのが一般的です。

未定義のパラメータを渡すことができますか?

はい。

487
bobince

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

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

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

undefinedまたはnullを正しくテストするには、以下を使用してください。

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

if(testvar === null) { ... }
16
Tatu Ulmanen

基本的な違いは、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;

「要約すると、未定義は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

12
Todd

Null値をチェックする最善の方法は、

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

そして未定義の

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

あなたは未定義で変数を割り当てることができます。

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

はい、できます、undefinedは defined undefinedとしてです。

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

あなたの場合:

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

create あなた自身の未定義変数も可能です。

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

あなたの最初の質問に答えるために、not演算子(!)はそれが真偽値に与えられるものは何でも強制します。したがって、null0falseNaN、および""(空の文字列)はすべてfalseになります。

5
Skilldrick

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

Ubuntu 12.10のJavaに付属のjs 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 /';を実行すると、変数を未定義に設定するたびにその値が返されます。

未定義の値のエイリアンを最初に出力し、それを実行する方法を疑問に思うかもしれません。それはJavaScriptの巻き上げのためです: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

2
Eric Leschinski

これを試して:

// found on UglifyJS
variable = void 0;
2
Cqq Cqq

楽しみのためだけに、ここに "未割り当て"を変数に代入するためのかなり安全な方法があります。これが衝突するためには、ランダムに生成された文字列とまったく同じ名前で、誰かがObjectのプロトタイプに追加する必要があります。私はランダム文字列ジェネレータを改良することができると確信しています、しかし私はちょうどこの質問から1つを取りました: JavaScriptでランダムな文字列/文字を生成する

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

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()];
0
rdans

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

if (document.getElementById)

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

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

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

0
Guffa