Javascript省略三項演算子


102

PHP 5.3では、この冗長な三項演算子構文を使用する代わりに、

startingNum = startingNum ? startingNum : 1

...必要に応じて、3項演算子の省略構文を使用できます。

startingNum = startingNum ?: 1

そして、私はJavaScriptの三項演算子について知っています:

startingNum = startingNum ? startingNum : 1

...しかし速記はありますか?

回答:


175
var startingNumber = startingNumber || 1;

それがあなたが探しているもののようなもので、未定義の場合はデフォルトになりますか?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

ちなみに、これはオブジェクトを含む多くのシナリオで機能します。

var foo = bar || {}; // secure an object is assigned when bar is absent

確かに、今朝は弾んでいます。修正されましたが、通知に感謝します。
ブラッドクリスティー

1
あなたが意味するものではありません。||代わりに??
ロケットハズマット

2
ありがとう!あなたはそれを釘付けにしました。このインスタンスでは実際にオブジェクトを使用しています。:)
Web_Designer 2012年

8
JSの||演算子はtrueまたはfalseを返さず、最初の「真の」値を返すため、これは機能します。あなたが持っていると言うval0val1としてundefined、そしてval2ある2val3です3。 これは最初の「真の」値なので、val0 || val1 || val2 || val3を返し2ます。
ジェイク

2
このイディオムはアンチパターンではありませんか?0または空の文字列を渡した場合、「OR」式はそれをスキップし、実際に0または空の文字列が必要なデフォルト値を使用します。
Paul Trzyna

24

|| 遭遇した最初の真の値を返すため、C#と同様に合体演算子として使用できます。 ??

startingNum = startingNum || 1;

私は他の説明よりもあなたの説明が好きです
ajax333221 '17年

12

はいあります:

var startingNum = startingNum || 1;

一般expr1 || expr2に、次のように機能します(ドキュメントで言及されているように)。

expr1に変換できるかどうかを返しますtrue。それ以外の場合はを返しますexpr2したがって、Boolean値とともに使用すると、いずれかのオペランドがである場合に||戻ります。両方の場合、を返します。truetruefalsefalse


if a is truthy対と言う方がより正確ではありませんif a is evaluated to trueか?
JaredPar 2012年

3
@JaredPar:あいまいさを避けるために、元の詳細な説明をMozilla Developer Networkの説明に置き換えました。あいまいさが少なくなるはずです。
Tadeck 2012年

2
var startingNum = startingNum || 1;

この場合、OR演算子を使用できます。


2
startingNum = startingNum || 1

次のようにnullのある条件がある場合

startingNum = startingNum ? startingNum : null

「&&」を使用できます

startingNum = startingNum && startingNum

しかし、偽物でanything && nullない限り、null と評価されませんanythingか?
ペトルザ

ええ、何かが真実である場合、評価はnullになります。その偽の場合、偽の値に評価されます
a2441918

1

上記の答えは正しいです。JavaScriptでは、次のステートメント:

startingNum = startingNum ? otherNum : 1

次のように表すことができます

startingNum = otherNum || 1

ここでカバーされないもう1つのシナリオは、一致しない場合に値がfalseを返すようにする場合です。このためのJavaScript省略表現は次のとおりです。

startingNum = startingNum ? otherNum : 0

しかし、それは次のように表すことができます

startingNum = startingNum && otherNum

他の人がより一般的な答えを探している場合に備えて、別のシナリオを取り上げたかっただけです。


このようなものの省略形はありますx = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24か:???
oldboy

@Anthonyいいえ、innerWidth * 0.0375 > 24あるif true部分とは異なるためinnerWidth * 0.0375。短縮形は、the expression to be evaluatedとthe if trueが同じ値である場合にのみ使用できます。同じ理由で、速記ができなくなりますx = someBoolean ? 'Heck yea!' : 'No way!'
deedub

@deedubよく、実際には、「速記」があります(それを呼び出す場合)Math.max(innerWidth * 0.0375, 24)
oldboy

@Anthonyそれを;)とは呼ばないでしょうMath.maxが、ユースケースでは三項演算子よりもうまく機能します。
-deedub

1
" startingNum = startingNum ? otherNum : 1は" と表現できますstartingNum = otherNum || 1が、誤りです。私はこれをテストしました
oldboy '28

0

次のような三項を作成するには:

boolean_condition ? true_result : false_result

JavaScriptでは、次のことができます:

(boolean_condition && true_result ) || false_result;

例:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"

すっごくx = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24なります(innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24innerWidth * 0.0375変数に割り当てる以外に、繰り返す必要がないように省略形はありますか?
oldboy

1
この場合、Math.max( innerWidth * 0.0375 , 24 )エレガントに動作します。より一般的なケースでは、変数を作成するのではなく、読みやすさを向上させる「somethingifiedInnerWidth」などと呼ばれる説明的なメソッドを作成することをお勧めします。場合によっては、変数を(その説明的な名前で)持つ方が読みやすいかもしれませんが、将来的には、「なぜこれが乗算されるのですか?」発生しません。
xxjjnn

うわー、uが2番目の引数を提供できることさえ知らなかったMath.max。超エレガントなソリューション!!
oldboy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.