76

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

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

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

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")....
4

6 に答える 6

131

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

if ( typeof pagetype !== 'undefined' && pagetype == 'textpage' ) {
  ...
}
于 2012-12-19T01:11:40.170 に答える
21

使用できますtypeof

if (typeof pagetype === 'undefined') {
    // pagetype doesn't exist
}
于 2012-12-19T01:11:47.310 に答える
9

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

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

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

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

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

しかし、私はこのようにそれを書くことはありません

于 2012-12-19T01:42:29.123 に答える
4

存在をテストするには、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
于 2012-12-19T01:22:52.193 に答える
3

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

var pagetype = pagetype || false;
if (pagetype === 'something') {
    //do stuff
}
于 2012-12-19T01:25:17.047 に答える
3

変数が宣言されているかどうかは、変数が宣言されていない場合に try..catch を使用してエラーを発生させる以外に判断できません。次のようにテストします。

if (typeof varName == 'undefined') 

がスコープ内の変数であるかどうかvarNameはわかりません。typeof でテストすると undefined が返されるだけです。例えば

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

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

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

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

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

  • グローバル オブジェクトは、実際には変数オブジェクトではありません。グローバル変数に一致するプロパティを持ち、グローバル変数へのアクセスを提供するため、変数オブジェクトのように見えます。
于 2012-12-19T01:32:00.463 に答える