我将举例解释:

猫王运算符(?:)

“猫王运算符”是缩写 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

当前回答

Javascript的逻辑OR运算符短路,可以取代你的“猫王”运算符:

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

然而,据我所知,没有与你的?相当的。操作符。

其他回答

在很晚的时候,有一个建议[1]的可选链接目前在第二阶段,与巴别塔插件[2]可用。目前在我所知道的任何浏览器中都没有。

https://github.com/tc39/proposal-optional-chaining https://www.npmjs.com/package/@babel/plugin-proposal-optional-chaining

我个人使用

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

例如,safe get:

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

我阅读了这篇文章(https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript),并使用代理修改了解决方案。

function safe(obj) {
    return new Proxy(obj, {
        get: function(target, name) {
            const result = target[name];
            if (!!result) {
                return (result instanceof Object)? safe(result) : result;
            }
            return safe.nullObj;
        },
    });
}

safe.nullObj = safe({});
safe.safeGet= function(obj, expression) {
    let safeObj = safe(obj);
    let safeResult = expression(safeObj);

    if (safeResult === safe.nullObj) {
        return undefined;
    }
    return safeResult;
}

你这样称呼它:

safe.safeGet(example, (x) => x.foo.woo)

如果表达式在其路径上遇到null或undefined,则结果将是未定义的。你可以随意修改Object原型!

Object.prototype.getSafe = function (expression) {
    return safe.safeGet(this, expression);
};

example.getSafe((x) => x.foo.woo);

这是一个简单的猫王运算符等价:

function elvis(object, path) {
    return path ? path.split('.').reduce(function (nestedObject, key) {
        return nestedObject && nestedObject[key];
    }, object) : object;
}

> var o = { a: { b: 2 }, c: 3 };
> elvis(o)

{ a: { b: 2 }, c: 3 }

> elvis(o, 'a');

{ b: 2 }

> elvis(o, 'a.b');

2

> elvis(o, 'x');

undefined

2019年9月更新

是的,JS现在支持这个。 可选的链接很快就会出现在v8中