JavaScriptで未定義の変数を確認する方法


913

変数が定義されているかどうかを確認したいと思いました。たとえば、次は未定義のエラーをスローします

alert( x );

このエラーをキャッチするにはどうすればよいですか?



5
:次のようになりますが祖父であるstackoverflow.com/questions/1485840/...の stackoverflow.com/questions/2647867/...: -偉大なおじいちゃん多分これstackoverflow.com/questions/27509/...
ランダム

1
これは、マークされた複製の複製ではありません。変数の解決とオブジェクトプロパティの解決は大きく異なります。より良い複製は、変数がJavaScriptに存在するかどうかを確認する方法です?
RobG、2015年

エラーは、変数が宣言されていないことが原因です。ほとんどの回答は課題に焦点を当てています。詳細については私の答えを参照しください。さらに、それらの多くは、nullおよびundefinedがJavaScriptのオブジェクトであると誤って述べています。それらはプリミティブであり、オブジェクトではありません...
JBallin

回答:


1691

JavaScriptではnull、オブジェクトです。存在しないものには別の価値がありundefinedます。DOMはnull、ドキュメント内の一部の構造を見つけることができないほとんどすべての場合に戻りますが、JavaScript自体undefinedでは値が使用されます。

第二に、いいえ、直接同等のものはありません。特にを確認したい場合はnull、次のようにします。

if (yourvar === null) // Does not execute if yourvar is `undefined`

変数が存在するかどうかを確認する場合は、try/ catchでのみ実行できます。これtypeofは、が宣言されていない変数との値で宣言された変数undefinedを同等のものとして扱うためです。

しかし、変数が宣言されていて宣言されいないかどうかを確認するにはundefined

if (yourvar !== undefined) // Any scope

以前は、typeof未定義を安全にチェックするために演算子を使用する必要がありました。これはundefined、変数のように再割り当てすることが可能だったためです。古い方法は次のようになりました:

if (typeof yourvar !== 'undefined') // Any scope

問題undefinedの再割り当て可能はあなたが安全に使用することができます2009年に発売されたのECMAScript 5に固定された===!==のために、テストにundefined使用しないでtypeofundefined、読み取り専用されているいくつかの時間のために。

メンバーが独立して存在するかどうかを知りたいが、その値が何であるかを気にしない場合:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

変数が真実かどうかを知りたい場合:

if (yourvar)

ソース


71
undefinedは予約語ではありません。あなた(または誰か他の人のコード)が "undefined = 3"を実行すると、2つのテストが失敗します。
Jason S

6
「変数が存在することはわかっているが、変数に値が格納されているかどうかわからない場合」-ええと?!
Jason S

36
彼は割り当てられていない宣言された変数を参照していると思います。例:var foo; // fooは存在するが値はない
Wally Lawless

3
うーん...「ソース」リンクに気づきました。この投稿全体はメーリングリストからの直接の引用であり、元の作者が明確にしていないため、おそらくより明確にするために編集する必要があります。
Jason S、

11
「JavaScriptではnullはオブジェクトです。」というのは実際には正しくありません。おそらく、この誤解の原因はtypeof演算子(typeof null == 'object')です。null値があるプリミティブ値の値のみであり、ヌル型
CMS

347

変数が真であるかどうかを本当にテストする唯一の方法undefinedは、以下を実行することです。undefinedはJavaScriptのオブジェクトです。

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

このスレッドの他のソリューションのいくつかは、変数が定義されていても(たとえば、NULLまたは0の値で)変数が未定義であると思わせる場合があります。


18
質問は未定義ではなかったので、typeof someVar!== 'undefined'である必要がありますよね?
eomeroff

1
本当に、未定義がオブジェクトであるとは思わないので、まずドキュメントを確認してくださいdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus

2
を生成しない唯一のテストReferenceError
Nostalg.io 2015年

2
このコードは正しいですがundefined、JavaScriptのオブジェクトは誤った情報であると言っています。とにかく、このステートメントはあなたの答えに関連していますか?これはundefinedtype という値でundefined、という名前のグローバル識別子に割り当てられundefinedます。
SimplGy

1
これが唯一の方法であるという点で今は正しくありません。undefinedES5以降、読み取り専用になっています。次のif (x === undefined) {...}ように、未定義を使用して、または省略形を使用して安全にテストできますif (x === void 0)
Stephen M Irving

66

技術的には、適切な解決策は(私は信じています):

typeof x === "undefined"

あなたは時々怠惰になって使うことができます

x == null

ただし、これにより、未定義の変数xとnullを含む変数xの両方がtrueを返すことができます。


1
あなたが入力した場合var x;、その後、typeof x;あなたが得るでしょう"undefined"、あなたがやっているかのようにtypeof lakjdflkdsjflsj;
ムハンマドUmer

それで、未定義だが宣言された変数をチェックする方法はありませんか?
Muhammad Umer

1
私はそうは思いません。なぜあなたがしたいのか分かりません。
Jason S

ujndefinedは頂点の間にあるべきではありません
LowFieldTheory

頂点とはどういう意味ですか?
Jason S

19

さらに簡単で簡単なバージョンは次のとおりです。

if (!x) {
   //Undefined
}

または

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
関数呼び出しからxが設定されている場合、最初のコードは正しくない可能性があります。x = A();のように Aが何も返さない場合、デフォルトでは「未定義」を返します。!xを実行すると、論理的に正しいtrueになります。ただし、A()が0を返す場合、!xはx = 0なのでfalseになります。ただし、JSでは!0も真です。
Rajat、

2番目のコードは次のように短縮できます。if(!typeof(XX)){...} else {...}
Alejandro Silva

2
@AlejandroSilva返信が遅くなってすみません。typeofは文字列を返すため、これは機能しません。未定義の変数に対しては「undefined」を返し、それがTRUEと評価され、定義された変数の誤検知が発生します。
ドミトリファルコフ2015年

5
最初のスニペットを取り除いてください、それはただ悪いです
ファンメンデス

1
他のコメントは、最初の例が悪いことを指摘しましたが、その理由は明確ではありません。したがって、新しいコーダーの場合:!xはxが定義されているかどうかをテストしませんが、それが真実かどうかをテストします。文字列、ブール値true、正の数値はすべて真実です(そして私はいくつかのことを忘れているかもしれません)が、0、ブール値false、空の文字列などの他の有効な値は真実ではありません。最初の例は特定の使用例(たとえば、空を未定義と同じように処理できる場合の文字列のテスト)で機能しますが、多くの場合は機能しないため、デフォルトのチェック方法とは見なされません。
cfc 2018年

16

私はよくやった:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
「==」を「===」に変更することを検討してください。doSomething(null)を呼び出すと、アラートも表示されます。それがあなたが望むものでない限り。
Jason S、

うん。同等か完全に等しいかを決定する必要があります。どちらの場合にも使用できます。
Joe

1
単に次のようにチェックしてください-> if(typeof variableName!== 'undefined'){alert(variableName);}
Muhammad Sadiq

いずれにせよ、未定義の変数を関数に渡すことができないため、これは役に立たない
avalanche1

2
できますよ。引数なしで関数を呼び出してみてください。
ジョー

3

三項条件演算子も使用できます。

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


もしもvar a = false;a===undefined代わりにそれを確認する必要があります
Iter Ator

1
質問:未定義の変数を確認してください.....これは未定義の変数です:var x; 上記を実行するとエラーが発生します
Muhammad Umer

「a = falseの場合、 "i dont know 'a'"」と表示されます–これが問題です。問題は、それが真であるかどうかではなく、定義されているかどうかをテストすることです。aがfalseとして定義されている場合、aは未定義ではありません。その場合、これは誤った結果を返します。このアプローチが機能しない理由の詳細については、stackoverflow.com / a / 858270/2055492に関する私のコメントを参照してください。
cfc 2018年

!atrueでundefinedあるかどうかをテストするだけでなく、0and nullおよびでもtrueをテストしますfalse。これは非常に正しくないため、削除する必要があります。
Stephen M Irving

2

私はしばしば最も簡単な方法を使用します:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

編集:

変数を初期化しないと、「Uncaught ReferenceError:variable is not defined ...」という例外がスローされます。


2
Uncaught ReferenceError: variable is not defined
Muhammad Umer

@MuhammadUmer、間違った!variableによって定義されvar variable;ます。そして、このスニペットはvariableローカルスコープでオーバーライドします。クロージャまたはグローバル変数へのアクセスを期待しているロジックを壊す可能性があります。すなわち:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
ЕвгенийСавичев

2

別の潜在的な「解決策」は、windowオブジェクトを使用することです。ブラウザでの参照エラーの問題を回避します。

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

これは元の質問をまったく解決せず、まったく無関係です。ポスターは、何かが真実か偽かをテストする方法を尋ねていなかった、と彼はテストする方法を尋ねたundefined。これはそれをしません。
スティーブンMアービング

2

エラーはx存在しないことを示しています!値が割り当てられているのとは異なり、宣言されていません。

var x; // declaration
x = 2; // assignment

を宣言した場合x、エラーは発生しません。存在する/宣言されているが値が割り当てられていないundefinedため、アラートxが表示されます。

変数が宣言されているかどうかを確認するには、を使用できますtypeof。変数が存在するかどうかを確認する他の方法では、最初に取得したのと同じエラーが発生します。

if(typeof x  !==  "undefined") {
    alert(x);
}

これは、に格納されている値のタイプをチェックしていますx。それだけで返されますundefinedときxに宣言されていないか、またはそれがあればしていると宣言されて、まだ割り当てられていませんでした。


undefinedはES5(2009リリース)以降は読み取り専用であり、typeof演算子は不要になりました。
スティーブンMアーヴィング

2

voidオペレータが戻るundefinedことに渡される引数/発現のために。その結果をテストできます(実際には、いくつかの縮小機能はコードをからundefinedに変更してvoid 0、2、3文字を保存します)。

例えば:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

丁度!これが正解です。恥ずかしいです。だれもがまだ使い続けているので、10年ほど前から不可能だったtypeof考え方undefinedを再割り当てできます。
Stephen M Irving

これはES5以前でも安全でした。当時は、再割り当てしたundefinedとしても、神はどのような理由を知っているだけなので、使用void 0は常にundefined関係なく戻ります。
スティーブンMアーヴィング

1

undefined以下のように確認できます

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

1

以下のようなことをしてください:

function isNotDefined(value) {
  return typeof value === "undefined";
}

そしてそれを次のように呼び出します:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

受け入れられた答えは正しいです。オプションをもう1つ追加したかっただけです。try ... catchブロックを使用してこの状況を処理することもできます。気まぐれな例:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

catchブロックレベルのスコープを作成するため、少し面倒なブロックに注意してください。そしてもちろん、この例は質問に答えるために非常に単純化されており、エラー処理のベストプラクティスはカバーされていません;)


0

小さな関数を使用して、変数が宣言されていることを確認します。これにより、JavaScriptファイルの乱雑さを大幅に削減できます。値のチェックを追加して、変数が存在するだけでなく、値が割り当てられていることを確認します。2番目の条件は、変数がインスタンス化されているかどうかをチェックします。変数が定義されているがインスタンス化されていない場合(以下の例を参照)、コードでその値を参照しようとすると、エラーがスローされます。

インスタンス化されていません- var my_variable;インスタンス化されています-var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

次に、条件ステートメントを使用して、変数が次のように定義され、インスタンス化されていることをテストできます...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

または、それが定義およびインスタンス化されていないことをテストするには...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
述語をすぐに返してみませんか?return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.