16

コードが宣言されていない変数にアクセスするのを防ぐために、使用します

if (typeof myVar != 'undefined')

これは問題なく動作しますが、別の if ステートメントを追加したいと思います。これを変換するようなもの:

if (typeof myVar != 'undefined'){
    if (myVar == "test"){}
}

これに:

if (typeof myVar != 'undefined' && myVar == "test")

未定義の可能性があることを考慮して、この最後のコードは、使用のすべてのケースとすべてのブラウザmyVarで安全ですか?

内のさまざまなステートメントが、記述if ()された順序で評価されない可能性はありますか?

が未定義の場合、決して実行されmyVar == "test"ないと仮定できますか?myVar

4

6 に答える 6

12

が未定義のmyVar == "test"場合、決して実行されないと仮定できますか?myVar

はい。テストする式は論理 AND 式であり、2 つのオペランドの評価順序が指定されています。

プロダクションLogicalANDExpression : LogicalANDExpression && BitwiseOREExpressionは次のように評価されます (強調を追加)。

  • lrefをLogicalANDExpressionの評価結果とします
  • lvalを GetValue( lref )とします。
  • ToBoolean( lval ) が false の場合、 lvalを返します。
  • BitwiseOREExpressionを評価した結果を rref とます
  • GetValue( rref ) を返します。

つまり、基本的には、最初のオペランドを評価し、その評価の結果が でありfalse、式全体がfalseであり、2 番目のオペランドが評価されないことを意味します。

于 2013-08-29T10:02:57.600 に答える
6

はい、大丈夫です。

JavaScript では、優先順位は次のとおりです。

typeof> !=/==>&&

が false の場合a && b、forbは実行されません。a

于 2013-08-29T10:03:20.993 に答える
5

はい、&&演算子を使用している場合、最初の条件がfalse の場合、2 番目の条件はテストされません。

于 2013-08-29T10:02:50.567 に答える
2
if (typeof myVar != 'undefined' && myVar == "test")

式は左から右に評価されるため、そうである場合は短絡します (myVar は「test」と比較されません)。myVarundefined

于 2013-08-29T10:02:55.200 に答える
1

&& 演算子を使用すると、渡された条件は渡された順序で評価されます。

あなたの場合:

if (typef myVar != 'undefined' && myVar == 'test')

プログラムがこの if ステートメントに入ると、最初に変数の型が未定義かどうかをチェックし、true を返す場合は 2 番目の引数に進み、myVar の値が「test」であるかどうかをチェックします。myVar == 'test' の場合でも、if ステートメントは false && true の値を評価し、true を返します。両方の条件が true を返す場合にのみ、式が true (true && true) として評価されるため、コード ブロックが実行されます。

最初の条件なら

typeof myVar != 'undefined'

false を返すと、2 番目の条件は評価されません。

于 2013-08-29T10:07:09.247 に答える
-1

非常に重要です。使用する

if (myVar !== undefined)

これは、前に割り当てがあった場合、myVar が渡される方法がないことを意味します。

これは単純な文字列なので、使用'undefined'しないでください。

幸運を!

于 2013-08-29T10:06:56.367 に答える