私はJavaScriptのundefined
とnull
の値について少し混乱しています。
if (!testvar)
は実際に何をしますか?それはundefined
およびnull
、あるいは単にundefined
をテストしますか。
変数が定義されたら、それをクリアしてundefined
に戻すことができます(したがって変数は削除されます)。
undefined
をパラメータとして渡すことができますか?例えば。:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Javascriptが未定義で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'
を返します。参照しようとした場合に通常発生するエラーをスローするのではありません。 (括弧で囲まれた単純な変数を指定することもできますが、not存在しない変数を含む完全な式を指定することもできます)。
これは物議を醸すものです。存在しないオブジェクトのプロパティにアクセスしても、他のすべての言語のようにすぐにエラーになることはありません。代わりに、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、または未定義かをテストしますか。
このような「真実性」テストは、false
、undefined
、null
、0
、NaN
、および空の文字列に対してチェックします。しかしこの場合、はい、それは本当にundefined
です。 IMO、それについてもっと明確にし、if (testvar!==undefined)
と言うべきです。
変数が定義されたら、それを未定義に戻すことができます(したがって変数は削除されます)。
undefined
を確実に代入することはできますが、それによって変数が削除されることはありません。 delete object.property
演算子だけが本当に物事を取り除きます。
delete
は、実際は変数ではなくプロパティを対象としています。ブラウザを使えばdelete variable
をそのまま使うことができますが、これはお勧めできません。ECMAScriptの第5版の厳密モードでは動作しません。何かへの参照を解放してガベージコレクションができるようにしたい場合は、variable= null
と言うのが一般的です。
未定義のパラメータを渡すことができますか?
はい。
変数が未定義になることはなくなるため、未定義のものとして定義することはできません(できませんか?)。definedを何かに定義するだけです。
undefined
を関数に渡すことはできません(できませんか?)。空の値を渡したい場合は、代わりにnull
を使用してください。
ステートメントif(!testvar)
はブールのtrue/false値をチェックします。この例ではtestvar
がfalse
に評価されるかどうかをテストします。定義上、null
およびundefined
はtrue
またはfalse
として評価されるべきではありませんが、JavaScriptはnull
をfalse
として評価し、未定義の変数を評価しようとするとエラーになります。
undefined
またはnull
を正しくテストするには、以下を使用してください。
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }
基本的な違いは、undefined
とnull
は異なる概念を表すということです。
null
しか利用できなかった場合、null
が意図的に値として設定されているのか、それともまだ値が設定されていないのかを判断することはできません。
var a;
a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;
ただし、意図的に値をnull
に設定すると、undefined
との厳密な等価性が失敗するため、null
とundefined
の値を区別できます。
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に固有のものではなく、ブール値の結果がtrue
、false
、不明(null
)、値なし(undefined
)、または何らかの問題(error
)になる可能性があるという一般化された概念は完全です。
Null値をチェックする最善の方法は、
if ( testVar !== null )
{
// do action here
}
そして未定義の
if ( testVar !== undefined )
{
// do action here
}
あなたは未定義で変数を割り当てることができます。
testVar = undefined;
//typeof(testVar) will be equal to undefined.
はい、できます、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
あなたの最初の質問に答えるために、not演算子(!
)はそれが真偽値に与えられるものは何でも強制します。したがって、null
、0
、false
、NaN
、および""
(空の文字列)はすべてfalseになります。
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
これを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
これを試して:
// found on UglifyJS
variable = void 0;
楽しみのためだけに、ここに "未割り当て"を変数に代入するためのかなり安全な方法があります。これが衝突するためには、ランダムに生成された文字列とまったく同じ名前で、誰かが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()];
For if (something)
およびif (!something)
は、何かが定義されているかどうかを確認するためによく使用されます。例えば:
if (document.getElementById)
識別子はブール値に変換されるため、undefined
はfalse
として解釈されます。 false
として解釈される他の値(0や ''など)ももちろんありますが、識別子にそのような値を合理的に含めるべきではないか、そのような値をundefinedと同じように扱うことで満足です。
Javascriptには、オブジェクトのメンバーを削除するために使用できるdelete
演算子があります。変数の範囲に応じて(つまり、グローバルかどうかにかかわらず)、変数を未定義にするために削除できます。
未定義のリテラルとして使用できるundefined
キーワードはありません。未定義にするために関数呼び出しでパラメータを省略することができますが、それは関数に渡すパラメータを少なくすることによってのみ使用できます。途中でパラメータを省略することはできません。