web-dev-qa-db-ja.com

三項演算子、エルビス演算子、安全なナビゲーション演算子、論理OR演算子の比較

三項演算子、Elvis演算子、安全なナビゲーション演算子、論理演算子、角度付き演算子との比較


三項演算子(ステートメント?obj:obj)

let gender = user.male ? "male" : "female";

エルビスオペレーター(?:)

let displayName = user.name ?: "";

安全なナビゲーションオペレーター(?。)

let displayName = user.name ?. "";

論理OR演算子

let displayName = user.name || "";

上記のすべてのオペレーターは、同じプロセスを同様に行っています。違いの利点は何ですか、どれが最も良く、最も悪いのですか?

14

たぶん私はいくつかのバージョンを見逃したかもしれませんが、私の知る限りでは、TypeScriptにはelvis演算子も安全なナビゲーション演算子もありません。彼らが持っている唯一の余分なものは、null以外のアサーション演算子!.ですが、これはコンパイラー専用であり、コンパイルされたjsでは!が削除されます。 Angularただし、テンプレート内に安全なナビゲーション演算子がありますが、内部的には論理演算子または||に解決されます。ここでの利点は、読みやすさが向上し、テンプレートが小さくなることです。

それ以外に、TypeScriptには?:表記がありますが、これはインターフェースまたはメソッドパラメーターで使用され、値がオプションであることを示します

これにより、3項演算子と論理ORが残ります。 3つの値がある場合は、最初の値を使用します。質問、答えはイエスの結果、答えはノーの答えです。

そして後者は2つの値がある場合です。真実に解決された場合、最初の1つが答えになります。それ以外の場合は、その値に関係なく2つ目が答えになります。

利益の面では、私はあまり言うことができません。私はそれらが同等に速く、わずかな違いがあることを期待します。おそらく、論理または||の代わりに常に使用できる3項オプションを使用すると、読みやすさが向上しますが、個人的には、コードをコンパクトに保つ​​ため、||を使用するのが好きです。

TLDR;

  • 三項演算子

他の場合は簡略化、どこでも利用可能

  • Elvis演算子?:

TypeScript/javascript/angularでは使用できず、基本的に||と同じ

  • セーフナビゲーションオペレーター?.

angularテンプレートでのみ使用可能、オブジェクトパラメータナビゲーションでnullポインタを防止するために使用

  • 論理または||

左手でなければ右手。それ以外の場合はさらに簡略化されます。 TypeScript/javascript/angularで利用可能

9
PierreDuc

安全なナビゲーションオペレーター(?。)は、Angular2でのみElvisオペレーターとも呼ばれます

これは、Angular2テンプレートバインディングのものであり、JavaScriptでは使用できません。

三項演算子(ステートメント?obj:obj)

これは、条件をチェックし、その条件が真実である場合は値を返すか、偽の場合は別の値を返します。

論理OR演算子

これは、それ自体の存在または真実性に基づいて値を返したい場合(したがって、他のルールは含まれません)は、Terneryとは非常に異なります。

let displayName = user.name || "";

上記の例では、これらの式のいずれかが真実である場合は、それを返します。

let gender = user.male ? "male" : "female";

あなたが言っていることは、私の状態が真実なら「男性」を返し、そうでなければ「女性」を返す

エルビスオペレーター(?:)

これはJavaScriptでは使用できません。PHPのような他の言語でも見つかる可能性があります。また、Ternery演算子とほぼ同じですが、比較の左側( side)を戻り値として使用できます。

そう :

let m = something ?: somethingElse // if in case of truthiness of `something` you want to return `something` , you can do this

と等しい:

let m = something ? something : somethingElse 

EDIt:それらを比較しても意味がありません。彼らはまったく同じことをしていません。

2
Milad

@Milad RameshRajendran angular2では、Safe Navigation Operator(?。)の代わりにelvisという用語を使用できます。私によると、両方とも同じで、名前と混同しないでください


私はこれから何かを得た source

エルビスオペレーター(?:)

「Elvis演算子」は、Javaの三項演算子の短縮形です。これが便利な例の1つは、式がfalseまたはnullに解決された場合に「実用的なデフォルト」値を返すことです。簡単な例は次のようになります。

def gender = user.male ? "male" : "female"  //traditional ternary operator usage

def displayName = user.name ?: "Anonymous"  //more compact Elvis operator

安全なナビゲーションオペレーター(?。)

Safe Navigationオペレーターは、NullPointerExceptionを回避するために使用されます。通常、オブジェクトへの参照がある場合、オブジェクトのメソッドまたはプロパティにアクセスする前に、それがnullでないことを確認する必要がある場合があります。これを回避するために、セーフナビゲーションオペレーターは、次のように、例外をスローする代わりに単にnullを返します。

def user = User.find( "admin" )           //this might be null if 'admin' does not exist
def streetName = user?.address?.street    //streetName will be null if user or user.address is null - no NPE thrown

しかし、私は上記を知りたいのですが、すべての演算子が同じプロセスを同じように実行しています。違いの利点は何ですか、どれが最良で最悪ですか?

1
let gender = user.male ? "male" : "female";

javascript(TypeScript)およびHTMLタグバインディングで使用できます。

基本的に、JavaScriptコードでこの演算子を使用する場合、最初のステートメントが最初に実行されるよりもtrueの場合、それ以外の場合は2番目のオプションを実行

Angular2用語ではTernary OperatorSafe Navigation Operator (?.)として知られていますが、用語Elvis Operator (?: )バックエンドまたは何らかのデータベースから非同期データをフェッチするときに使用されます。

alternate:-次のように、angular2テンプレートでElvis Operator (?: )を使用することもできます(これは省略形のプロパティと言えます)

let gender = user.gender || "";

こちらもご覧ください

1
Pardeep Jain