JavaScriptの1行の「if」ステートメント-最高の構文、この代替?


201

意見はあるものの、1行のifステートメントで中括弧を使用しないことは、保守性と可読性にとって理想的ではないと明確に述べられています。

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

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

それはさらに圧縮されており、拡張された場合、中括弧は忘れられません。露骨な問題はありますか?そうでない場合は、考慮事項は何ですか?それでも、少なくとも三項演算子と同じくらい、非常に読みやすいと思います。読みやすさのため、三項演算子はあまり提案されていないように思えますが、その結論は全会一致ではないように感じます。

私の悪魔の双子はこれを提案したいと思いますが、構文は明らかにそれを意味するものではなく、おそらく単に悪い考えです。

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

2
:JavaScriptがフレーズの条件文の終わりをサポートしていればいいだろうdocument.write("My evil twin emerges") if lemons
ボー・スミス

7
if、elseステートメントについて考えているかもしれません。(variable = (condition) ? true-value : false-value;。)がんばって。
プロゴ2014年

回答:


328

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

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

個人的にはif、次のように角括弧なしの1行を使用することがよくあります。

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

さらにステートメントを追加する必要がある場合は、ステートメントを次の行に置き、角かっこを追加します。私のIDEは自動インデントを行うので、この方法に対する保守性の反対は意味がありません。


11
私は後者が好きです。入力と最初のもう1つの創造的な代替案をありがとう!
デビッドホブズ2013

空の文字列と0は誤った値であるため、2番目のステートメントの実行に失敗します
Orlando

1
もちろん、そこにさらに明示的なブール文を入れることもできます
acjay

7
@PeterOlsonなぜ保守性に対する反対意見が根拠がないのですか?他の開発者がその構成でIDEを使用しない場合はどうなりますか?
agconti 14

2
括弧なしのステートメントの場合は、1行をサポートするように勇気を持って発言していただきありがとうございます。いつか私たちの子供たちはあなたに感謝します。
Marc M.

136

私はそれを次のように使用します:

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

36
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji 2017年

43

PHPで一般的に使用されている次の形式を使用できます。

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

12
にブラケットは必要ありませんlemon
leymannx 2015年

6
条件付きステートメントの周りに()を含めることをお勧めします-他の開発者の操作の順序などに関する混乱を取り除きます。私は通常、まともな資格を持つ誰かが混乱する方法がない場合を除いて、それを指定することを間違っています。
djvs 2017

1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh

括弧はブール型の強制を意味するので、私は括弧が好きです。
Daniel Sokolowski

18

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

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

私はこれが好きです。それが誰かを助けることを願って


16

これを使うことができ、

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

説明:lemons存在する場合、私にalert("please give me a lemonade") else alert("then give me a beer")


素晴らしいソリューション。
Davidson Lima

1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
stib

15

//別の簡単な例

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

15
なぜ単純に.. var a = 11; alert(a === 10);
ManuKaracho 2016年

@ManuKaracho私は三項ステートメントを扱うときにこの問題をよく見ます。OPが単純なものを書こうとしていたのかもしれませんが、私が職場で読んだコードでは蔓延しています。
adam-beck

alert(a === 10 ? "true" : "false")
Josh Wood

@JoshWoodアラートはブール値も出力するため、alert(a===10)マヌーが言ったように実行できます。
キース

12

多くの人が言っているように、もし実際の1行を探しているなら、

    if (Boolean_expression) do.something();

優先されます。ただし、if / elseを実行する場合は、3項が友だちです(これも非常に優れています)。

    (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への叫び


7

すでに述べたように、次のものを使用できます。

&& スタイル

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'


単線短絡では、「リターン」を省略でき、期待どおりに機能するはずです。`` `レモン&&" fooは私にバーを与えました "; //機能します!`` `
siwalikm

@siwalikmについて説明してもらえますか?これは、戻りたくない場合lemons(それが誤っている場合)です-が真実である場合にのみ、「fooが私にバーを与えた」を返しますlemons
マルク

(lemons)が「fooが私にバーを与えた」を返す場合; これは間違っています。「Uncaught SyntaxError:Illegal return statement」
Fenec

@Fenecは、このエラーの原因となるブラウザとバージョンを共有しますか?これはほぼ2年前に私のために働き、私のために働き続けます。
マルク

4

三項演算子を使用することを支持する多くの投票で多くの回答を見てきました。3値は、a)代替オプションがあり、b)単純な条件からかなり単純な値を返す場合に最適です。だが...

元の質問には代替案がありませんでした。単一の(実際の)分岐のみを持つ3項演算子は、信頼できる答えを返すように強制します。

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

最も一般的なバリエーションはlemons ? 'foo...' : ''であり、true、false、truey、falsey、null、nil、空白、空(私たちのなしで?)に関する任意の言語の無数の記事を読むことからわかるように、地雷原(十分に文書化された地雷原ですが)

三項のいずれかの部分が複雑になるとすぐに、より明示的な形式の条件を使用したほうがよいでしょう。

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



2

矢印関数の例:

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

約束で:

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

さもないと:

if(somethingTrue) thenDo()

単純な条件付きの場合は、可能な場合はいつでもif(value)を使用することをお勧めします。ステートメントの冒頭にあるifという単語は、括弧と疑問符よりも何が起こっているかについて多くを語るからです。


1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

割り当て操作でも丸括弧で行うことができます

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

「割り当て操作でも丸括弧で行うことができます」。これは非常に興味深いです。これらの単一行の操作内で割り当て操作を実行できることを知りませんでした。
サギット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.