回答:
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'
、そのオペランドが存在しない単純な変数である場合に、参照しようとすると通常発生するようなエラーをスローする代わりに戻ります。(また、それを括弧に包まれた、単純な変数を与えることができますが、ない非existant変数を含む完全な表現。)そのためあまり使用し、どちらか。
これは物議を醸すものです。存在しないオブジェクトのプロパティにアクセスしても、他のすべての言語のようにすぐにエラーが発生することはありません。代わりに、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」に対するテストをチェックfalse
、undefined
、null
、0
、NaN
、空の文字列。しかし、この場合、そうです、それは本当にundefined
懸念していることです。IMO、それはそれについてより明確であると言うべきif (testvar!==undefined)
です。
変数が定義されたら、それをクリアして未定義に戻すことができます(したがって、変数を削除します)。
あなたは確かundefined
にそれに割り当てることができますが、それは変数を削除しません。delete object.property
本当に削除するのはオペレーターだけです。
delete
実際には、変数自体ではなくプロパティを対象としています。ブラウザーを使用すると、straightを使用できますdelete variable
が、これはお勧めできません。ECMAScriptFifth Editionのストリクトモードでは動作しません。ガベージコレクションできるように参照を解放したい場合は、と言うのが一般的variable= null
です。
undefinedをパラメーターとして渡すことはできますか?
はい。
undefined
はシングルトンオブジェクトですか?どういう意味ですか?これはプリミティブ値であり、オブジェクトではありません。
typeof foo=='undefined'
。それは私が明示的であると言うことを好むだろうその場合、グローバル・スニッフィング(4A)のために使用される傾向にある'foo' in window
、または(4B)に対して試験undefined
Iは、読み取り可能と言うことを好むだろうその場合-value自体、foo===undefined
。理論的には、typeof
に対するテストに'undefined'
は、他の構成要素では提供できないユースケースがあります。ローカル変数の存在をスニッフィングします。ただし、実際には、ローカルで宣言されている変数はほとんど常に知っています。
return
ステートメントのない関数がを返すことundefined
ですが、関数がコンストラクター(new
演算子で呼び出される)の場合this
、return
ステートメントがないにもかかわらず、新しいオブジェクト(コンストラクター内の値)を返します。console.log((function (){}()));
を返しますundefined
。 console.log((new function (){}()));
オブジェクトを返します。
変数はもはや未定義ではないので、何かを未定義として定義することはできません(すべきではありませんか?)- 何かに定義しただけです。
undefined
関数に渡すことはできません(すべきではありませんか?)。空の値を渡したい場合は、null
代わりに使用してください。
このステートメントif(!testvar)
は、ブール値のtrue / false値をチェックします。この特定の値は、がにtestvar
評価されるかどうかをテストしfalse
ます。定義により、またはとして評価されるべきではnull
ありundefined
ませんが、JavaScriptはとして評価され、未定義の変数を評価しようとするとエラーが発生します。true
false
null
false
undefined
またはを適切にテストするにはnull
、次を使用します。
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }
==
および!=
)の使用を推奨していません。
var a= undefined
。あなたは渡すことができfn(undefined)
ます。p
オブジェクトの未定義のプロパティと、に定義および設定されてo
いるプロパティの違いを見つけるには、演算子を使用する必要があります。p
undefined
'p' in o
testvar === undefined
より複雑ではなくテストすべきではない理由はありtypeof(testvar) === "undefined"
ますか?
typeof
未定義の変数のテストを使用するもう1つの理由があります。とは異なりnull
、undefined
単にグローバルオブジェクトのプロパティであり、それ自体が再定義される場合があります。特定のコーディングスタイルと等号の欠落のみを受け取り、undefined
静かに変更されます:if (undefined = someVar) {...}
undefined
は、グローバルオブジェクトの不変のプロパティを作成することでこれをほぼ修正しているため、以前よりも安全です。ただし、次のような可変変数を定義することは可能です。undefined
関数内でであるため、問題は完全に解消されていません。
基本的な違いは、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に固有のものではなく、それはboolean型の結果ができることを一般概念を完了しtrue
、false
未知(null
)、値なし(undefined
)、または何かが間違っていました(error
)。
null
うまくいきます。a == null
これはtrue
、JavaScriptタイプの強制型変換のためです。
はい、できます。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
最初の質問に答えるために、not演算子(!
)は、与えられたものをすべてブール値に強制変換します。ですからnull
、0
、false
、NaN
及び""
(空の文字列)は、すべての偽表示されます。
undefined
として表示されずfalse
、 'is not defined'エラーがスローされます。
if (undefined) {/* Do stuff*/}
ため、エラーは発生しませんundefined
。エラーになるのは次のようなものですif (someUndeclaredVariable) {/* Do stuff*/}
js
Ubuntu 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
これを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
for if (something)
およびif (!something)
は、何かが定義されているかどうかを確認するために一般的に使用されます。例えば:
if (document.getElementById)
識別子はブール値に変換されるため、undefined
として解釈されfalse
ます。もちろん、次のように解釈される他の値(0や ''など)があります。false
ますが、識別子にそのような値が合理的に含まれていないか、そのような値をundefinedと同じように扱うことに満足しています。
JavaScriptにはdelete
、オブジェクトのメンバーを削除するために使用できる演算子があります。変数のスコープに応じて(つまり、グローバルかどうか)、削除して未定義にすることができます。
undefined
未定義のリテラルとして使用できるキーワードはありません。関数呼び出しでパラメーターを省略してそれらを未定義にすることができますが、それは関数に送信するパラメーターの数を減らすことによってのみ使用でき、途中でパラメーターを省略することはできません。
楽しみのために、ここに変数に「未割り当て」を割り当てるかなり安全な方法があります。これが衝突するためには、ランダムに生成された文字列とまったく同じ名前を持つオブジェクトのプロトタイプに誰かが追加する必要があります。ランダム文字列ジェネレータは改善できると確信していますが、この質問から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()];