web-dev-qa-db-ja.com

「Else」のないJavaScriptの三項演算子

何も持たないelse条件にnullを常に入れなければなりませんでした。とにかく周りにありますか?例えば。

condition ? x = true : null;

基本的に、行う方法があります:

condition ? x = true;

今では構文エラーとして表示されます

参考までに、実際のサンプルコードを次に示します。

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
116
Oscar Godson

まず第一に、三項式はif/else構造の代替ではありません-if-else構造と同等のreturns値です。つまり、if/else句はコードであり、3項式はであり、値を返すことを意味します。

これはいくつかのことを意味します。

  • 戻り値を割り当てる=の左側に変数がある場合にのみ、3項式を使用します
  • 戻り値が2つの値のいずれかである場合にのみ3項式を使用します(または、それが適合する場合はネストされた式を使用します)
  • 式の各部分(?とafter:の後)は副作用なしで値を返す必要があります(式x = trueはすべての式が最後の値を返すのでtrueを返しますが、xは戻り値に影響を与えずに変更されます)

要するに、三項式の「正しい」使用は

var resultofexpression = conditionasboolean ? truepart: falsepart;

例のcondition ? x=true : null ;の代わりに、三項式を使用してxの値を設定する場合、これを使用できます。

 condition && (x = true);

これはまだ式であり、検証に合格しない可能性があるため、さらに良いアプローチは

 void(condition && x = true);

最後のものは検証に合格します。

ただし、期待値がブール値の場合は、条件式自体の結果を使用するだけです

var x = (condition); // var x = (foo == "bar");

UPDATEサンプルに関しては、おそらくこれがより適切です。

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
191
Sean Kinsey

いいえ、3つのオペランドが必要です。それが、彼らが三項演算子と呼ばれる理由です。

ただし、例として持っているものについては、これを行うことができます:

if(condition) x = true;

将来的に複数のステートメントを追加する必要がある場合は、中括弧を使用する方が安全です。

if(condition) { x = true; }

編集:これで、質問が適用される実際のコードに言及しました。

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }
18
In silico
var x = condition || null;
11
philfreo

多くの場合、人々は論理演算子を使用してステートメントの構文を短縮します。

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');

しかし、あなたの特定のケースでは、構文はさらに簡単になります

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

このコードは、defaults.slideshowWidthがtrueと評価された場合はdefaults.slideshowWidth値を返し、そうでない場合はobj.find('img').width()+'px'値を返します。

詳細については、論理演算子の Short-Circuit Evaluation を参照してください。

9
Eugene Tiurin

あなたは書くことができます

x = condition ? true : x;

したがって、条件が偽の場合、xは変更されません。

これは、その後と同等です

if (condition) x = true

編集:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

いくつかの選択肢があります-これらがより良い/悪いとは言いません-単に選択肢

既存の値がnullであるため、3番目のパラメーターとしてnullを渡すと機能します。リファクタリングして条件を変更すると、これはもはや真実ではないという危険があります。これに対する三次ガードの2番目の選択肢として、既存の値を渡します。

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

より安全ですが、おそらく見た目が良くありません。実際には、私はおそらく書くだろう

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'
4
mdma

あなたの場合、三項演算子が冗長であると思います。 ||、&&演算子を使用して、変数を式に直接割り当てることができます。

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

となります :

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

より明確で、より「javascript」スタイルです。

2

どうでしょう

    if (condition) { code if condition = true };
0
Yandiro