三元运算符,Elvis运算符,安全导航运算符和逻辑OR运算符的比较

时间:2017-05-18 11:48:56

标签: angular typescript operators

与三元运算符与Elvis运算符与安全导航运算符与角度

中的逻辑或运算符的比较

三元运算符(声明?obj:obj)

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

猫王操作员(?:)

let displayName = user.name ?: "";

安全导航操作员(?。)

let displayName = user.name ?. "";

逻辑或运营商

let displayName = user.name || "";
  

以上所有运营商都在做同样的过程。有什么不同的好处,哪一个是最好的&最坏?

4 个答案:

答案 0 :(得分:7)

也许我错过了几个版本,但据我所知,TypeScript没有elvis操作员或安全导航操作员。他们唯一的额外事情是非空断言运算符!.,但这仅适用于编译器,而在编译的js中,!将被删除。然而,Angular在其模板中确实有安全的导航操作符,但在引擎盖下,这将解析为逻辑或||。这里的好处是提高了可读性和更小的模板。

除此之外,TypeScript确实具有?:表示法,但这在接口或方法参数中用于指示该值是可选的

这使我们得到三元运算符vs逻辑或。如果有3个值,您将使用第一个。问题,答案是结果,答案没有结果提出问题。

后者有2个值时。如果第一个,如果解决为真理将是答案,否则第二个,无论其价值如何。

好处,我真的不能说太多。我希望它们同样快,边际差异。也许使用三元选项可以提高可读性,你显然可以使用它而不是逻辑或||,但我个人喜欢使用||,因为它使代码保持紧凑。

<强> TLDR;

  • 三元运营商

简化if else,随处可用

  • 猫王操作员?:

在typescript / javascript / angular中不可用,与||

基本相同
  • 安全导航操作员?.

仅在角度模板中可用,用于防止对象参数导航中的空指针

  • 逻辑或||

如果不是左手,那么右手。如果不是更简化的话。提供打字稿/ javascript / angular

答案 1 :(得分:2)

  

安全导航操作员(?。),在Angular2中也被错误地称为Elvis操作符

这是一个Angular2模板绑定的东西,它在javascript中不可用。

  

三元运算符(声明?obj:obj)

当你想检查一个条件并且该条件是真实的时,返回一个值,或者如果它的假值返回另一个值。

  

逻辑或运营商

当你想根据它自己的存在或真实性返回一个值时(所以没有涉及其他规则),它与Ternery有很大的不同。

let displayName = user.name || "";

在上面的示例中,您要说的是,如果这些表达式中的任何一个都是真实的,请将其返回,如下所示:

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

你所说的是:如果我的条件是真实的,那么回归&#34;男性&#34;否则返回&#34;女性&#34;

  

猫王运营商(?:)

这在javascript中不可用,您可以在PHP等其他语言中找到它,它与Ternery运算符基本相同,但在比较的左侧(真实方面)简化了可以用作返回值:

所以:

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 :(得分:1)

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

可用于javascript(Typescript)以及HTML标记绑定,

基本上,当您在javascript代码中使用此运算符时,这意味着第一个语句是否为true而不是先执行,否则执行第二个选项

在angular2条款Ternary Operator中称为 Safe Navigation Operator (?.) ,或者您可以使用当时使用的术语 Elvis Operator (?: ) 从后端或某种数据库中获取异步数据。

替代: - 你也可以在angular2模板中使用 Elvis Operator (?: ) 这样的(我们可以说这是速记属性)

let gender = user.gender || "";

在这里看看

答案 3 :(得分:1)

  

@Milad RameshRajendran你可以在angular2中使用术语elvis而不是安全导航操作符(?。),根据我的说法,两者都是一样的,不要与名字混淆

我从这个source获得了一些东西:

猫王运营商(?:)

  

“猫王操作员”是一种缩短   Java的三元运算符。一   这个方便的例子是   返回'合理的默认值'   如果表达式解析为false或   空值。一个简单的例子可能看起来像   这样:

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

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

安全导航操作员(?。)

     

使用安全导航操作符   避免NullPointerException。   通常在您有参考时   您可能需要验证的对象   在访问之前它不是null   对象的方法或属性。   为避免这种情况,安全导航   operator只会返回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
  

但我想知道以上所有运营商都在做同样的过程。有什么不同的好处,哪一个是最好的&amp;最坏吗