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


149

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

condition ? x = true : null;

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

condition ? x = true;

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

参考までに、ここにいくつかの実際のサンプルコードがあります:

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

21
3項のlikeの使用は、condition ? x = true : null;おそらくと書かれるべきですx = (condition ? true : null);。余談ですが、JavaScriptではnullfalseと評価されるため、この場合x = (condition);は同じ結果を得ることができます。
マットS

1
マット、あなたの答えは最高ですが、それは答えではなく、コメントです!
Cheeso

マット、私の実際のコードは:!defaults.slideshowWidth?defaults.slideshowWidth = obj.find( 'img')。width()+ 'px':null; それを書くためのより短い、より良い方法?
オスカーゴッドソン

2
defaults.slideshowWidth = defaults.slideshowWidth || obj.find( 'img')。width()+ 'px';
ケネベック2010年

それはアイデンティティの割り当てを避けるために良いだろう、これは単なる条件でなければなりません:if (!defaults.slideshowWidth) defaults.slideshowWidth = obj.find('img').width()+'px'
ミハイルMalostanidis

回答:


226

まず、3項式はif / else構成の代わりにはなりません。これ、値を返す if / else構成と同等です。つまり、if / else句はコードで、3項式は式です。、それが値を返すことを意味し、。

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

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

一言で言えば、三項式の「正しい」使用は

var resultofexpression = conditionasboolean ? truepart: falsepart;

condition ? x=true : null ;3値式を使用しての値を設定する例の代わりに、次のように使用xできます。

 condition && (x = true);

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

 void(condition && x = true);

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

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

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

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

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

4
見事なSO、i/else文字数が足りないため編集でタイプミスを修正できない。
dewd 2015

1
void(condition && x = true)-これは見栄えは良いが、「無効な割り当ての左側」エラーをスローするように見える
Eugene Tiurin

1
void(condition &&(x = true))//割り当てを最初の値から分離します
diamondsea

4
ただし、特にこのスタイルに慣れていない開発者にとって、これは直感的に理解できません。これは、次のように簡単かつ読みやすく記述できます。if(条件){x = true; }
diamondsea

2
「検証に合格しない可能性がある」とはどういう意味ですか?式をで囲む必要がある理由がわかりませんvoid()。ありがとう。
ギラドマヤニ2018

20

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

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

if(condition) x = true;

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

if(condition) { x = true; }

編集:あなたの質問が当てはまる実際のコードに言及したので:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }

1
できますが、すべきではありません。少なくとも中かっこなしではなく、非常にエラーが発生しやすいです。
Konerak、

1
本当?カーリーを必要とする主な理由はjslintの生活を楽にするからだと理解しました。
Cheeso

@Cheesoリファクタリングの意味でエラーが発生しやすい。中括弧がないことに気づかずに、真の状態の場合にさらに追加するために戻ってきます。新しいコードは、trueの場合ではなく、常に実行されます。
マットS

いいえ、わかりません。if(){} else {}などのエクストラなしで条件文を書くのと同じですか?
Oscar Godson、

3
正直なところ、Javascriptよりも言語を使うことを怖がっている開発者は知りません。私はそれらをたくさん省略し、誤ってブレースを逃した場合よりもトラブルが発生することはありません。
アンディE

12

多くの場合、ステートメントの構文を短くするために論理演算子を使用します。

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

しかし、特定のケースでは、構文はさらに単純になる可能性があります

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

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

詳細については、論理演算子の短絡評価を参照してください。



5

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

x = condition ? true : x;

そのため、条件がfalseの場合、xは変更されません。

これは次に同等です

if (condition) x = true

編集:

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

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

3番目のパラメーターとしてnullを渡すと、既存の値がnullであるため機能します。条件をリファクタリングして変更すると、これが当てはまらない危険があります。三元の2番目の選択肢として既存の値を渡すと、これを防ぐことができます。

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

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

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

いくつかのライブコードは(とにかくこれでnullを取り除くためですか?):!defaults.slideshowWidth?defaults.slideshowWidth = obj.find( 'img')。width()+ 'px':null;
Oscar Godson、

2

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

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

となります :

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

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



1

配列またはオブジェクト宣言内で他に3項演算子を使用しない場合は、ES6スプレッド演算子を使用できます ...()

const cond = false;
const arr = [
  ...(cond ? ['a'] : []),
  'b',
];
    // ['b']

そしてオブジェクトの場合:

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

元のソース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.