2

すべてのページで UI コンポーネントを実行していますが、ページの 1 つで、それにリンクされた追加の機能があります。UI コンポーネントには と呼ばれるブール値がMyValueあり、追加機能には と呼ばれるオブジェクトがExtraObjectあり、そのプロパティの 1 つは と呼ばれるブール値ExtraBoolです。

MyValue が true かどうか、および ExtraObject.ExtraBool が false かどうかをテストしたいのですが、ExtraObject が存在する場合のみです。そうすれば、ExtraObject がないページにいる場合でも、エラーは発生しません。

私はこれを試しました:

if (MyValue === true && 
    (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {...}

これはどう書き直せばいいのでしょうか?

現在、「ExtraObject is not defined エラー」が発生し続けています。

ありがとう。

4

4 に答える 4

2

それは次のようになります。

typeof ExtraObject === "undefined"

typeof式の型をstringとして返すため、名前と結果を比較する必要があります"undefined"

私の意見では、あなたの状態は少し露骨すぎます。私はもっ​​と短いものを使います:

if (MyValue && !(ExtraObject && ExtraObject.ExtraBool)) {...}

独自の GUI コードと通信している場合は、型が期待どおりであると想定できます。JavaScript での型チェックはかなり面倒なので、何を扱っているかを知っていれば、あまり明示的ではありません。(ただし、これはユーザー入力には適用されません。ユーザー入力は決して信用しないでください。)

于 2012-06-12T20:57:29.403 に答える
1

真実のテーブルタイム!

A はMyValue*
B はwindow.ExtraObject**
C はExtraObject.ExtraBool

A B C | O
------+--
0 0 0 | 0
0 0 1 | 0
0 1 0 | n/a***
0 1 1 | 0
1 0 0 | 1
1 0 1 | n/a***
1 1 0 | 1
1 1 1 | 0

これらの値からわかることは、作成する最も簡単な方程式Oは次のとおりです。

A && !C

したがって、コードは次のようになります。

if (MyValue && !ExtraObject.ExtraBool) {}

ExtraObjectしかしもちろん、定義されていない場合に問題に遭遇したくないとおっしゃっていました。

var extraBool = window.ExtraObject ? ExtraObject.ExtraBool : false;
if (MyValue && !extraBool) {}

別の書き方extraBoolは次のとおりです。

var extraBool = window.ExtraObject && ExtraObject.ExtraBool;

次に、これをインライン化できます。

if (MyValue && !(window.ExtraObject && ExtraObject.ExtraBool)) {}

別の書き方!(a && b)は です!a || !b。これは、次のことを意味します。

if (MyValue && (!window.ExtraObject || !ExtraObject.ExtraBool)) {}

も正しいです。

*MyValue===trueどの程度厳密にする必要があるかによって異なります
** あるいは***未定義にしてアクセスすることtypeof ExtraObject !== 'undefined'
は実際には不可能ですExtraObjectExtraObject.ExtraBool

于 2012-06-12T21:24:42.113 に答える
1

ロジックは完全には正しくありません。

if (MyValue && ExtraObject && !ExtraObject.ExtraBool) { ... }

それはどちらも持つべきではないnull値になると思います。ExtraObjectつまり、あなたの条件は、オブジェクトへの参照である必要があると述べたほうがよいと思います。

したがって、私が書いた条件MyValueは、「真実」でExtraObjectあり、実際のオブジェクトへの参照であり、ExtraBoolそのオブジェクトのプロパティが「偽」である場合に真になります。

ブール定数と明示的に比較する必要がある場合もありますが、私の意見では、それはコードの匂いです。(もちろん、真贋をチェックするだけでも危険です…)

編集MyValueが true のときに式がtrue であり、オブジェクトへの参照ではない プロパティが true であることが要件である場合、次のように記述します。ExtraObjectExtraBool

if (MyValue && (!ExtraObject || !ExtraObject.ExtraBool)) { ... }

どちらが「より良い」かは、個人の好みと経験の問題です。

于 2012-06-12T20:58:06.557 に答える
-1
if ((MyValue === true) && (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {}
于 2012-06-12T20:58:19.387 に答える