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

20

Angular中三元运算符 vs Elvis运算符 vs 安全导航运算符 vs 逻辑或运算符的比较


三元运算符(statement ? obj : obj)

let gender = user.male ? "male" : "female";
Elvis运算符 (?:)
let displayName = user.name ?: "";

安全导航操作符(?.)

let displayName = user.name ?. "";
逻辑或操作符
let displayName = user.name || "";
以上所有运算符都在执行相同的过程。它们之间有什么不同的好处,哪一个最好,哪一个最差?
4个回答

12

更新

TypeScript 3.7中,他们实现了可选链操作符,它类似于安全导航操作符,但更好。此外,Nullish Coalescing也已经进入了这个场景。

如果您正在使用此版本,则下面的答案已过时。


我可能错过了一些版本,但据我所知,TypeScript没有elvis或安全导航操作符。它们唯一额外拥有的是非空断言操作符!,但这仅适用于编译器,在编译后的js文件中,!将被删除。然而,Angular在其模板中确实有安全导航操作符,但在底层,它将解析为逻辑或||。这里的好处是增加可读性和较小的模板。

除此之外,TypeScript还具有?:符号,但这只是用于接口或方法参数,以指示该值是可选的

这留下了三元运算符和逻辑或运算符。如果有3个值,您将使用第一个。问题,肯定的答案结果和否定的答案结果。

对于只有2个值的情况,您将使用后者。如果第一个值解析为真,则它将是答案;否则,无论其值如何,第二个值都将是答案。

就好处而言,我无法说太多。我希望它们在速度上差异微小,可能会增加可读性。您显然可以随时使用三元选项而不是逻辑或||,但我个人喜欢使用||,因为它使代码更紧凑。

简而言之;

  • 三元运算符

简化的if else语句,无处不在

  • Elvis运算符?:

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

  • 安全导航操作符?.

只在angular模板中可用,用于防止对象参数导航中的null指针

  • 逻辑或||

如果左边为false,则返回右边。更加简化的if else语句。typescript/javascript/angular中可用


不错。但我会等待更多的答案。 - Ramesh Rajendran
@RameshRajendran 对我的回答进行了一些更新,加入了一个tldr。 - Poul Kruijt
非常好,感谢您的回答。Elvis运算符?在TypeScript/JavaScript/Angular中不可用,本质上与||相同。但是我们在哪里使用这个Elvis运算符呢? - Ramesh Rajendran

3

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

这是一个Angular2的模板绑定方法,在javascript中不可用。

三元运算符(statement ? obj : obj)

当您想要检查条件并且如果该条件为真,则返回一个值,否则返回另一个值时,可以使用此操作符。

逻辑或运算符

当您想要根据值本身的存在或真实性来返回一个值(因此没有其他规则参与),它与三元运算符非常不同。

let displayName = user.name || "";

在上面的例子中,您正在说如果这些表达式中任何一个是真值,则返回它,而在下面的示例中:

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

你所说的是:如果我的条件为真,则返回“男性”,否则返回“女性”。
Elvis运算符(?:)在JavaScript中不可用,但你可以在其他语言(如PHP)中找到它。它基本上与三元运算符相同,但更简化,在比较的左侧(真实的一侧)可以用作返回值的情况下:
因此:
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 

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


是的。我不知道我们是否可以导入运算符,但我只在模板标签中使用它。 - Ramesh Rajendran
ELVIS是怎么样的? - Ramesh Rajendran
嘿@RameshRajendran,你可以在angular2中使用术语“elvis”代替“Safe Navigation Operator(?.)”。在我看来,它们两者是相同的,不要因为名称而感到困惑。 - Pardeep Jain
@Mildad 但是语法不同,包括 elvis like (?:) 和安全导航运算符(?.)。 - Ramesh Rajendran
兄弟,这个 (?:) 在Javascript和Angular2中都不起作用,我不知道你为什么还坚持将其与Angular2的安全导航进行比较。 但是人们错误地称Angular2的安全操作符为Elvis操作符,但实际上它并不是!!!! - Milad

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

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

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

在Angular2术语中,三元运算符被称为安全导航运算符(?.)或者您可以使用Elvis运算符(?:)来获取从后端或某种数据库获取异步数据的时候。

替代方案:- 您还可以像这样在angular2模板中使用Elvis运算符(?:)(我们可以将其称为速记属性)

let gender = user.gender || "";

这里也可以看一下:


您确定 ?: 在 Angular 中被支持吗?就我所知,只有安全导航符号 ?. 可以使用。 - Poul Kruijt
我不确定是否使用 ?:,但是在获取异步数据时,我们可以使用 ? 运算符进行安全导航,例如 abc?.def?.geh,这将防止抛出任何错误。 - Pardeep Jain
2
是的,那就是安全导航运算符 :) ?. - Poul Kruijt
但我认为安全导航和Elvis运算符是相同的,区别只在于名称,不是吗?@PierreDuc - Pardeep Jain
@PardeepJain。这也是我的想法。听起来像我的。 - Ramesh Rajendran
1
@PardeepJain 它们非常不同。Elvis运算符与||相同。let foo = bar ?: nose。如果bar解析为true,则结果将是bar,否则将是noselet foo = bar?.nose,如果bar没有名为nose的属性,则为undefined,否则将是bar上的nose属性的值。你不能比较这两个运算符。 - Poul Kruijt

1
@Milad,你可以在Angular2中使用“elvis”这个术语来代替安全导航运算符(?.),在我看来两者是相同的,不要因为名称而混淆。
我从这个来源得到了一些东西:
Elvis运算符(?: )是Java三元运算符的简写。其中一个有用的实例是在表达式解析为false或null时返回“合理的默认”值。一个简单的例子可能看起来像这样:
def gender = user.male ? "male" : "female"  //traditional ternary operator usage

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

安全导航运算符(?.)

安全导航运算符用于避免空指针异常。通常,当您引用一个对象时,您可能需要在访问对象的方法或属性之前验证它是否为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

但我想知道所有这些运算符是否都在执行相同的过程。它们的不同之处在哪里,哪个是最好的,哪个是最差的?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接