【问题标题】:Comparison of Ternary operator, Elvis operator, safe Navigation Operator and logical OR operators三元运算符、猫王运算符、安全导航运算符和逻辑或运算符的比较
【发布时间】:2017-05-18 11:48:55
【问题描述】:

与三元运算符与猫王运算符与安全导航运算符与逻辑或角度运算符的比较


三元运算符(语句?obj:obj)

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

猫王运算符 (?: )

let displayName = user.name ?: "";

安全导航运算符 (?.)

let displayName = user.name ?. "";

逻辑或运算符

let displayName = user.name || "";

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

【问题讨论】:

    标签: angular typescript operators


    【解决方案1】:

    更新

    通过TypeScript 3.7,他们实现了可选链接,类似于安全导航运算符,但效果更好。 Nullish Coalescing 也找到了到达现场的路。

    如果您使用的是此版本,则以下答案已过时


    也许我错过了几个版本,但据我所知,TypeScript 没有 elvis 运算符或安全导航运算符。他们唯一额外的东西是一个非空断言运算符!.,但这仅适用于编译器,并且在编译的js中!将被删除。然而,Angular 在其模板中确实有安全导航运算符,但在底层这将解析为逻辑或||。这样做的好处是增加了可读性和更小的模板。

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

    这给我们留下了三元运算符与逻辑或。如果有 3 个值,您将使用第一个。问题,答案是结果,答案不是结果。

    当有 2 个值时,后者。第一个,如果解决为真,将是答案,否则第二个,不管它的价值。

    利益方面,我真的不能说太多。我希望它们同样快,但差异很小。也许使用三元选项可以提高可读性,显然您可以始终使用它来代替逻辑或||,但我个人喜欢使用||,因为它可以保持代码紧凑。

    TLDR;

    • 三元运算符

    简化 if else,随处可用

    • 猫王运营商?:

    在 typescript/javascript/angular 中不可用,与 || 基本相同

    • 安全导航操作员?.

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

    • 逻辑或||

    如果不是左手,那么右手。 if else 就更简单了。在 typescript/javascript/angular 中可用

    【讨论】:

    • 好一个。但我会等待更多答案
    • @RameshRajendran 用 tldr 更新了我的答案
    • 太好了,感谢您的回答`猫王运算符?:在 typescript/javascript/angular 中不可用,与 || 基本相同` 但是我们在哪里使用这个 elvis 运算符呢?
    【解决方案2】:
    let gender = user.male ? "male" : "female";
    

    可以在javascript(Typescript)以及HTML标签绑定中使用,

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

    在 angular2 术语中,Ternary Operator 被称为 Safe Navigation Operator (?.) 或者您可以使用术语 Elvis Operator (?: ),它在从后端或某种数据库。

    alternate :- 你也可以像这样在 angular2 模板中使用 Elvis Operator (?: )(我们可以说这是简写属性)

    let gender = user.gender || "";
    

    也看这里

    【讨论】:

    • 你确定 Angular 支持 ?: 吗?据我所知,安全导航是?.
    • 我不确定是否使用?:,但是在获取异步数据时,我们可以使用? 运算符进行安全导航,就像abc?.def?.geh 这样可以防止抛出任何错误。
    • 是的,那是安全导航操作员 :) ?.
    • 但我认为安全导航和 elevis 运营商是相同的,只是名称不同,不是吗? @PierreDuc
    • @PardeepJain 他们非常不同。 Elvis 运算符与|| 相同。 let foo = bar ?: nose。如果bar 解析为真,这将导致foobar,否则为noselet foo = bar?.nose,如果bar 没有名为nose 的属性,则为undefined,否则为barnose 属性的值。你不能比较这两个运算符
    【解决方案3】:

    安全导航运算符 (?.),仅在 Angular2 中也被错误地称为 Elvis 运算符

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

    三元运算符(语句?obj:obj)

    当您想要检查一个条件并且如果该条件为真,则返回一个值,或者如果它是假的,则返回另一个值。

    逻辑或运算符

    这当你想根据它自己的存在或真实性返回一个值时(因此不涉及其他规则),它与 Ternery 非常不同。

    let displayName = user.name || "";
    

    在上面的例子中,你是说如果这些表达式中的任何一个是真实的,就返回它,在下面的位置:

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

    你的意思是:如果我的条件是真实的,返回“男”,否则返回“女”

    猫王运算符 (?: )

    这在 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 
    

    编辑: 比较它们是没有意义的,它们根本不是在做同样的事情。

    【讨论】:

    • 是的。我不知道我们是否可以导入运算符。但我只在模板标签中使用它
    • 猫王呢?
    • 嘿 @RameshRajendran 你可以在 angular2 中使用 elvis 而不是 Safe Navigation Operator (?.),据我说两者是相同的,不要与名称混淆。
    • @Mildad 但是语法不同elivs like (?:) and Safe Navigation Operator(?.)
    • 老兄,这个(?:) 在 Javascript 和 Angular2 中都不起作用,我不知道您为什么坚持将其与 Angular2 的安全导航进行比较。但是人们错误的说Angular2的Safe operator是Elvis operator,其实不是!!!!!!
    【解决方案4】:

    @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 而不是抛出异常,比如 所以:

    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
    

    但我想知道以上所有运营商都在做同样的过程。有什么不同的好处,哪个是最好的和最差的?

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 2010-12-31
      • 2012-07-16
      • 2020-04-14
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多