Javascript Ternary Operator vs. ||


17

以前にいくつかのnode.jsコードを見ていたのですが、それを書いた人が次の構文を好んでいるように思えたのです。

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

私がより簡潔であると考えるものについて:

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

2番目の形式が実際に社会的に受け入れられるJavaScriptシンタックスであるかどうか疑問に思っていましたが、この目的のために三項演算子よりも何度もそれを見てきました。

最初の例では、彼は二重の等号(三重の等号ではない)を使用していることに注意してください。ただし、JavaScriptで==がかなり悪い演算子であると多くの場所で読んでいます(JSLintは、IIRCに非常に反対です)。


2
コメント:コメントは明確な説明を求めるためのものであり、詳細な議論のためのものではありません。解決策がある場合は、答えを残してください。ソリューションが既に投稿されている場合は、投票してください。他の人とこの質問について話し合いたい場合は、チャットを使用してください。詳細については、FAQを参照してください

回答:


17

このコードは、0、 ""、false、またはその他の偽の値を渡すたびに「デフォルト値」に評価されるためです。

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

この特定の関数をどのように使用するかはわからないかもしれませんが、空の文字列や0やブール値などを渡すことに注意する場合は避けるのが悪いパターンです。


オブジェクトに対してヌル合体のみを使用する必要があります。オブジェクトが定義されている場合、これは機能しません。多分空の文字列を除いて。
マルフィスト

4
ゼロ比較は良い点です。これはまったく予想外のことです。
エドジェームズ

1
+1-この問題は、Pythonが(最終的に)「x if y else z」構文を追加した理由です。論理演算子のこれらのセマンティクスはかなり一般的であり、イディオムが条件付き選択演算子の作業をイディオムに依存する場合は常に、同じ一般的なエラーが発生する傾向があります。
Steve314

コンストラクトを括弧で囲むことを忘れないでください。文字列連結var txt = 'Hello, ' + (user_name||'User') + '!';と組み合わせて使用​​する場合は機能しますが、括弧なしでは-が得られundefinedます。jsfiddle.net/4mFAB/1
c69

7

本当に必要なのは、null合体演算子です。しかし、javascriptに実際にはないことを確認すると、プログラマは通常「||」を使用します それに代わって。

ただし、どちらも完全に合理的です。ヌル合体演算子が何であるかを理解していない人にとって、三項演算子はおそらく理解される可能性が高いでしょう。


別の関連する演算子は、IIRC「else」と綴られたアイコン演算子です。これは、最初の引数からの特殊な「失敗」結果を認識し、その場合の代替として2番目の引数を使用します。Pythonの「x if y else z」が2つの独立した演算子(「if」バイナリアサーション演算子とアイコンのような「else」演算子)を使用して実装され、それら2つの演算子が独立して使用できることを願っています。ただし、Iconはそのスタイルをサポートしていませんでしたが、代わりに相対演算子で奇妙なことをしていました。
Steve314

@ Steve314:Pythonにはあなたが望むものがあります:に結合され[false-part, true-part]た別のif演算子を持つ別のelse演算子。遅延動作が必要な場合は、真の部分と偽の部分を単純にラムダにできます。[..][bool(condition)][false-part, true-part][bool(condition)]
ライライアン

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