web-dev-qa-db-ja.com

JQuery / Javascript:varが存在するかどうかを確認します

可能性のある複製:
JavaScriptで変数が定義されているかどうかを確認するにはどうすればよいですか?
JavaScriptでnull、未定義、または空白の変数をチェックする標準関数はありますか?

2つの部分で発生するスクリプトがあります。

最初の部分は変数を設定します:

var pagetype = "textpage";

2番目の部分は単純なifステートメントです。

if(pagetype == "textpage") {
//do something
};

これで、2番目の部分であるifステートメントがサイトのすべてのページに表示されます。しかし、varが宣言されている最初の部分は、一部のページにのみ表示されます。

Varのないページでは、自然にこのエラーが発生します。

Uncaught ReferenceError: pagetype is not defined

だから私の質問は次のとおりです:JavaScriptまたはJQを使用して、varが存在するかどうかを検出する方法はありますか?

私は別のif文を使用するだけだと想像しています、例えば:

if ("a var called pagetypes exists")....
63
MeltingDog

SOにはこのような多くの答えがあると思いますが、ここに行きます:

if ( typeof pagetype !== 'undefined' && pagetype == 'textpage' ) {
  ...
}
116
elclanrs

typeofを使用できます:

if (typeof pagetype === 'undefined') {
    // pagetype doesn't exist
}
20
Blender

あなたの場合、他のすべてのelclanrs回答の99.9%が正解です。

ただし、undefinedは有効な値であるため、誰かが初期化されていない変数をテストする場合

var pagetype; //== undefined
if (typeof pagetype === 'undefined') //true

varが存在するかどうかを判断する唯一の100%信頼できる方法は、例外をキャッチすることです。

var exists = false;
try { pagetype; exists = true;} catch(e) {}
if (exists && ...) {}

しかし、私はそれをこのように決して書きません

9
jermel

存在をテストするには、2つの方法があります。

a。 "property" in object

このメソッドは、プロパティの存在についてプロトタイプチェーンをチェックします。

b。 object.hasOwnProperty( "property" )

このメソッドは、プロパティの存在を確認するためにプロトタイプチェーンを上に移動するのではなく、メソッドを呼び出すオブジェクトに存在する必要があります。

var x; // variable declared in global scope and now exists

"x" in window; // true
window.hasOwnProperty( "x" ); //true

次の式を使用してテストしている場合、falseを返します

typeof x !== 'undefined'; // false
4
Bruno

各条件ステートメントの前に、次のようなことができます。

var pagetype = pagetype || false;
if (pagetype === 'something') {
    //do stuff
}
3
Jason

Try..catchを使用して変数が宣言されているかどうかを判断することは、宣言されていない場合にエラーを発生させることは不可能です。次のようなテスト:

if (typeof varName == 'undefined') 

varNameがスコープ内の変数であるかどうかは通知せず、typeofでのテストで未定義が返されるだけです。例えば.

var foo;
typeof foo == 'undefined'; // true
typeof bar == 'undefined'; // true

上記では、fooは宣言されているがbarは宣言されていないことはわかりません。 inを使用して、グローバル変数をテストできます。

var global = this;
...
'bar' in global;  // false

ただし、グローバルオブジェクトはアクセスできる唯一の変数オブジェクト*であり、他の実行コンテキストの変数オブジェクトにはアクセスできません。

解決策は、常に適切なコンテキストで変数を宣言することです。

  • グローバルオブジェクトは実際には変数オブジェクトではなく、グローバル変数に一致するプロパティを持ち、それらにアクセスできるようにするだけで、1つのように見えます。
3
RobG