我将举例解释:

猫王运算符(?:)

“猫王运算符”是缩写 Java的三元运算符。一个 这很方便的例子是 返回一个“合理的默认值” 如果表达式解析为false或 null。一个简单的例子是这样的 这样的:

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

当前回答

你可以这样说来达到大致相同的效果:

var displayName = user.name || "Anonymous";

其他回答

我个人使用

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

例如,safe get:

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

?? 将在js中工作,这相当于?:在kotlin

这是一个有趣的解决方案,安全导航操作员使用一些mixin..

http://jsfiddle.net/avernet/npcmv/

  // Assume you have the following data structure
  var companies = {
      orbeon: {
          cfo: "Erik",
          cto: "Alex"
      }
  };

  // Extend Underscore.js
  _.mixin({ 
      // Safe navigation
      attr: function(obj, name) { return obj == null ? obj : obj[name]; },
      // So we can chain console.log
      log: function(obj) { console.log(obj); }
  });

  // Shortcut, 'cause I'm lazy
  var C = _(companies).chain();

  // Simple case: returns Erik
  C.attr("orbeon").attr("cfo").log();
  // Simple case too, no CEO in Orbeon, returns undefined
  C.attr("orbeon").attr("ceo").log();
  // IBM unknown, but doesn't lead to an error, returns undefined
  C.attr("ibm").attr("ceo").log();

对于前者,您可以使用||。Javascript的“逻辑或”操作符,不是简单地返回罐装的真值和假值,而是遵循这样的规则:如果左参数为真,则返回左参数,否则计算并返回右参数。当你只对真值感兴趣时,结果是一样的,但这也意味着foo || bar || baz返回包含真值的foo, bar或baz中最左边的一个。

但是,您将找不到一个可以区分false和null的值,并且0和空字符串是假值,因此避免使用value ||默认构造,其中value可以合法地为0或""。

我认为lodash _.get()在这里可以提供帮助,就像在_。Get (user, 'name'),以及更复杂的任务,如_。Get (o, 'a[0].b.c', 'default-value')