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

276

我会通过示例来解释:

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而不是抛出异常,如下所示:
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

11
“Elvis 操作符” 在 C# 中存在,但它被称为 null 合并运算符(相对不那么令人兴奋) :-) - Cameron
5
这个问题有点混乱... 它混淆了三个不同的运算符?:(三目运算符,在问题中拼写出来,可能是一个拼写错误),??(空值合并,JavaScript 中确实存在)和?.(Elvis 运算符),这在 JavaScript 中是不存在的。回答没有很好地澄清这个区别。 - JoelFan
3
@JoelFan,你能提供有关JavaScript中正确使用null合并(??)的文档链接吗?到目前为止,我找到的所有内容都表明JS仅具有“falsey”合并(使用||)。 - Charles Wood
@JoelFan 感谢您的跟进。我猜当您说JS有 ?? 时,那是一个打字错误 :D - Charles Wood
1
好的,我并不是说JS字面上有 ?? 这个运算符,而是它有null-coalesce...但即使在那里,我也有点错了。话虽如此,我已经看到了很多使用||作为null coalesce的JS代码,尽管存在falsey pitfalls。 - JoelFan
显示剩余6条评论
22个回答

0
我创建了一个包,使得使用它变得更加容易。 NPM jsdig Github jsdig 你可以处理像对象这样简单的事情:
const world = {
  locations: {
    europe: 'Munich',
    usa: 'Indianapolis'
  }
};

world.dig('locations', 'usa');
// => 'Indianapolis'

world.dig('locations', 'asia', 'japan');
// => 'null'

或者更加复杂一些:

const germany = () => 'germany';
const world = [0, 1, { location: { europe: germany } }, 3];
world.dig(2, 'location', 'europe') === germany;
world.dig(2, 'location', 'europe')() === 'germany';

-8

个人我使用

function e(e,expr){try{return eval(expr);}catch(e){return null;}};

例如安全获取:

var a = e(obj,'e.x.y.z.searchedField');

4
首先,您真的不应该使用eval。其次,这个代码甚至不能正常工作:e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d') 返回 null - Pylinux
@Pylinux 基本上可行的是 e = evalvar a = eval('obj.a.b.c.d')eval 甚至不需要第二个参数... https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval - Dorian

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