web-dev-qa-db-ja.com

JavaScriptの単一行の「if」文 - 最適な構文、この代替方法はありますか。

当然ながら、単一行のifステートメントに中括弧を入れることは、保守性と読みやすさにとって理想的ではないと明確に言えます。

しかし、これはどうですか?

if (lemons) { document.write("foo gave me a bar"); }

さらに圧縮されていて、展開しても中括弧は忘れられません。明白な問題はありますか。そうでない場合、考慮事項は何ですか?それでも、少なくとも三項演算子と同じくらい非常に読みやすいように感じます。 3項演算子は読みやすさのためにあまり推奨されていないようですが、その結論は全会一致ではないと私は感じます。

私の中の邪悪な双子は、これを示唆したいのですが、構文は明らかにそれを意味するものではなく、おそらく単なる悪い考えです。

(syntax) ? document.write("My evil twin emerges"): "";
160
David Hobs

これを実現するために使用されていた&&演算子の短絡動作を見たことがありますが、これに慣れていない人はそれを読みにくく、アンチパターンと呼ぶことさえできないかもしれません。

lemons && document.write("foo gave me a bar");  

個人的には、私はよく括弧なしで単一行のifを使うでしょう。

if (lemons) document.write("foo gave me a bar");

さらにステートメントを追加する必要がある場合は、ステートメントを次の行に配置して大括弧を追加します。私のIDEは自動字下げをしているので、このやり方に対する保守容易性の反対意見は議論の余地がありません。

272
Peter Olson

私はこれをこんな風に使っています:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");
108
asael2

PHPで一般的に使用されているこのフォーマットを使用できます。

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");
35
Macro

//もう一つの簡単な例

 var a = 11;
 a == 10 ? alert("true") : alert("false");
14
user3413838

この一行はずっときれいです。

if(dog) alert('bark bark');

私はこれが好きです。誰かに役立つことを願っています

13
shakee93

これを使うことができます、

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

説明:もしlemonsが存在するのなら、alert("please give me a lemonade")elsealert("then give me a beer")を教えてください。

多くの人が言っているように、もしあなたが実際の1行を探しているのであれば:

    if (Boolean_expression) do.something();

が好ましいです。あなたがif/elseをやろうとしているなら、三項はあなたの友達です(そしてまた超クールです):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

また:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

しかし、私は1つの非常に素晴らしい例を見ました。 @ Peter-Oslsonに&&を叫ぶ

    (Boolean_expression) && do.something();

最後に、これはif文ではありませんが、map/reduceまたはPromise.resolve()のいずれかを使用してループ内で物事を実行するのも楽しいです。 @brunettdanに叫ぶ

6
Kemacal

矢印関数の例:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

約束で:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

さもないと:

if(somethingTrue) thenDo()

単純な条件式であれば、可能な限りif(value)を使用することをお勧めします。Wordifは、文の冒頭に、句読点と疑問符よりも、何が起こっているのかについての詳細を示しています。

2
brunettdan

これはwhileループとifを含む単一行を使って行うこともできます。

if (blah)
    doThis();

whileループでも動作します。

2
Noitidart

すでに述べたように、あなたは使用することができます:

&& スタイル

lemons && document.write("foo gave me a bar");  

または

ブラケットレススタイル

if (lemons) document.write("foo gave me a bar");

短絡リターン

ただし、関数をショートするために1行のifステートメントを使用したい場合は、大括弧なしを使用してくださいバージョンはこんな感じ:

if (lemons) return "foo gave me a bar";

として

lemons && return "foo gave me a bar"; // does not work!

あなたにSyntaxError: Unexpected keyword 'return'を渡します

0
Marc

私は、三項演算子を使用することを提唱する多くの投票で多くの答えを見てきました。 a)代替オプションがあり、b)単純な条件からかなり単純な値を返す場合、3項は素晴らしいです。しかし...

元の質問には代替手段がありませんでした。1つの(実際の)分岐のみを持つ三項演算子を使用すると、誤った答えが返されます。

lemons ? "foo gave me a bar" : "who knows what you'll get back"

最も一般的なバリエーションはlemons ? 'foo...' : ''であると思います。また、true、false、truey、falsey、null、nil、blank、empty(なしで? )、あなたは地雷原に入っています(ただし、十分に文書化された地雷原です)。

三項のいずれかの部分が複雑になるとすぐに、より明示的な形式の条件付きの方が良いでしょう。

私がif (lemons) "foo"に投票していると言うのは長い道のりです。

0
Anita Graham
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

代入操作でも丸括弧ですることができます

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));
0