18

このようなステートメントのような条件演算子を使用しても問題ありませんか?

(x == y) ? alert("yo!") : alert("meh!");

それとも、そのような値を割り当てるために使用する方が正しいですか?

z = (x == y) ? "yo!" : "meh!";

ステートメントのように使用することが間違っていない場合、そのように実行するために複数行のコードを追加することは可能ですか? 複数行のコードに対して ifthen および switch ステートメントを使用する方が正しいですか?

(x == y) ? (alert("yo!"), document.write("woot!")) : (alert("meh!"), document.write("blah!"));
4

5 に答える 5

25

条件演算子は意図的に簡潔にしており、代入に特に役立ちます。

var a = x ? 1 : 2;

それらを使用して条件付きで関数を実行することは可能ですが、読みやすくするために IF/ELSE ステートメントを使用して行う必要があります。

// This is possible but IMO not best practice:
X ? doSomething() : doSomethingElse();

長くなりましたが、ほとんどの場合、これがより良い解決策です。

if (X) {
    doSomething();
} else {
    doSomethingElse();
}

IF/ELSE 構造の顕著な利点の 1 つは、最小限の手間で各条件の下に追加のタスクを追加できることです。

最後のスニペットも可能ですが、やや長文に見えますが、従来の論理構造の方が適している可能性があります。IF/ELSE ブロックのように。

とはいえ、条件演算子は引き続き読み取り可能です。

(something && somethingElse > 2) ?
   doSomeLongFunctionName()
   : doSomeOtherLongFunctionName();

最終的には、多くのことと同様に、個人の好みに依存します。あなたが書いているコードはあなただけのものではないことを常に覚えておいてください。将来、他の開発者がそれを乗り越えなければならないかもしれません。できるだけ読みやすいようにしてください。

于 2009-05-15T17:13:37.223 に答える
4

JavaScript がそれを妨げることはありませんが、コードを読む人を混乱させる非常に珍しい慣行です。

条件演算子は、ほとんどの場合、ステートメントではなく、2 つの代替値を選択するために使用されます。ステートメントは、ifステートメントの条件分岐に適しています。

最後の質問については、はい、本当に必要な場合は、[]構造を悪用できます。

(x == y) ? [alert("yo!"), document.write("woot!")] : otherstuff();

しかし、しないでください。8-)

于 2009-05-15T17:09:27.527 に答える
4

それは完全にあなた次第です、あなたはどちらの方法でもそれを行うことができます. ただし、このスタイルは会社のガイドラインに従っているか、このコードをどの程度読みやすくしたいかを自問する必要があります。

if ステートメントを使用すると、はるかに読みやすくなります。

個人的には、三項演算子は単純で迅速な true/false 条件 (そうするのが理にかなっている場合) または「インライン」が必要な場合にのみ使用します。

于 2009-05-15T17:10:11.223 に答える
2

Chris と JP の次の点に同意します。

  1. 条件演算子は短いステートメントに便利です。JP の変数割り当てはその好例です。var a = x ? 1 : 2;
  2. 複数ステートメントの句は、読みやすくするために、別の行に分割する必要があります。
  3. 条件演算子は、適切なインデントを使用して複数行のステートメントとして読みやすくすることができますが、if/else構文はほとんどの開発者にとってはるかになじみ深いものです。読みやすさとは、読者の期待に応えることです。そのため、親しみやすさは重要です。

複数行の条件演算子を使用すると、セミコロン挿入エラーが発生する可能性があることを付け加えておきます。詳細については、JSLint のドキュメント(「改行」のセクションを参照) を参照してください。複数行の条件演算子を使用する必要がある場合は、演算子が各行の最後にあることを確認してください。JPの複数行の例を次のように作り直します。

(something && somethingElse > 2) ?
   doSomeLongFunctionName() :
   doSomeOtherLongFunctionName();

前述したように、多くのスタイル ガイドがあり、好みのスタイル ガイドを選択できます。ただし、一部の選択肢は他の選択肢よりもエラーが発生しやすいものです。そのJSLintドキュメントをよく見てください。これは非常によく考えられたスタイル ガイドであり、これを順守する場合は、JSLint ツールを使用して潜在的な問題がないかコードを自動的にチェックすることもできます。

于 2009-05-15T21:26:43.197 に答える
2

次のように書くこともできますが、2 つの方法のどちらでもかまいません。

alert((x == y) ? "yo!" : "meh!");

それ以外は、複数行のステートメントにインライン条件を使用することはお勧めしません。標準の if/else ブロックを使用してください。入力した構文が有効な JS ではないことを考えると、複数のステートメントを匿名メソッドとヤダヤダに配置した可能性があり、ほとんど管理不能で不必要に難しいコードのもつれた混乱に陥ります。繰り返しますが、標準の if/else です。

于 2009-05-15T17:09:11.337 に答える