web-dev-qa-db-ja.com

JavaScriptで未定義の変数をチェックする方法

変数が定義されているかどうかを確認したいのですが。たとえば、次のように定義されていないエラーが発生します。 

alert( x );

どうすればこのエラーを見つけることができますか?

805
Jineesh

JavaScriptでは、nullはオブジェクトです。存在しないものには別の値、undefinedがあります。 DOMは、文書内で何らかの構造を見つけられない場合、ほとんどの場合nullを返しますが、JavaScript自体ではundefinedが使用される値です。

第二に、いいえ、直接の等価物はありません。本当にnullを特にチェックしたい場合は、次のようにしてください。

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

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

しかし、変数が および として宣言されているかどうかを確認するには、undefinedを使用します。

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

変数が存在することがわかっていて、そこに値が格納されているかどうかを確認したい場合は、

if (yourvar !== undefined)

メンバーが独立して存在するかどうかを知りたいが、その値が何であるかは気にしないでください。

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

変数が truthy であるかどうかを知りたい場合は、

if (yourvar)

出典

1564
Natrium

変数がundefinedであるかどうかを真にテストする唯一の方法は、次のようにすることです。未定義はJavaScriptのオブジェクトです。

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

このスレッドの他の解決策の中には、変数が定義されていても(たとえば、NULLまたは0の値で)、変数が未定義であると信じるように誘導するものがあります。

313
Michael Wales

技術的には、適切な解決策は次のとおりです(私は信じています)。

typeof x === "undefined"

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

x == null

しかし、それは未定義変数xとnullを含む変数xの両方がtrueを返すことを可能にします。

61
Jason S

私はよくやった:

function doSomething(variable)
{
    var undef;

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

さらに簡単でより簡略化されたバージョンは次のようになります。

if (!x) {
   //Undefined
}

OR

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

三項条件演算子を使用することもできます。

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);

3
John

他の可能性のある「解決策」はwindowオブジェクトを使うことです。ブラウザでの参照エラーの問題を回避します。

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

私はしばしば最も簡単な方法を使います。

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

編集:

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

1
mokiSRB

void 演算子は、渡された引数/式に対してundefinedを返します。その結果をテストすることができます(実際には2、3文字を節約するために、一部のミニファイヤーはコードをundefinedからvoid 0に変更します)。

例えば:

void 0
// undefined

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

以下のようにundefinedをチェックできます 

var x; 

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

エラーは、xが存在しないことを示しています! 宣言済みではなく、割り当て済み値とは異なります。

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

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

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

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

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

0
JBallin

変数が宣言されたことを確認するために小さな関数を使用しています。これにより、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 }
0
MistyDawn

以下のようにしてください。

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

そしてそれを次のように呼ぶ:

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

受け入れられた答えは正しいです。もう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ブロックは、ブロックレベルのスコープを作成するので、少し面倒です。そして、もちろん、例は尋ねられた質問に答えるために非常に単純化されています、それはエラー処理のベストプラクティスをカバーしません;)。