javascript中是否有空合并(Elvis)运算符或安全导航运算符?

我将通过示例进行解释:

猫王操作员 (?: )

“Elvis 运算符”是 Java 三元运算符的缩写。这很方便的一个实例是,如果表达式解析为 false 或 null,则返回“合理的默认值”值。一个简单的示例可能如下所示:

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

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

安全导航操作员 (?.)

安全导航运算符用于避免 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

您可以使用逻辑“OR”运算符代替 Elvis 运算符:

例如。displayname = user.name || "Anonymous"

但是Javascript目前没有其他功能。如果你想要一种替代语法,我建议你看看CoffeeScript。它有一些类似于您要查找的速记。

例如,存在运算符

zip = lottery.drawWinner?().address?.zipcode

函数快捷方式

()->  // equivalent to function(){}

性感函数调用

func 'arg1','arg2' // equivalent to func('arg1','arg2')

还有多行注释和类。显然,您必须将其编译为javascript或插入到页面中,但它:)添加了很多功能。使用实际上仅用于开发,而不是生产。<script type='text/coffeescript>'<script type='text/coffeescript'>


答案 2

我认为以下内容相当于安全导航运算符,尽管时间稍长:

var streetName = user && user.address && user.address.street;

streetName然后将是 或 的值。user.address.streetundefined

如果您希望它默认为其他内容,则可以与上述快捷方式结合使用或提供:

var streetName = (user && user.address && user.address.street) || "Unknown Street";