没有CoffeeScript的CoffeeScript中的问号语法

时间:2014-09-11 09:53:42

标签: javascript coffeescript

CoffeeScript有这样的语法糖:

item.getFoo?().fooParam?.bar

通过getFoo==nullfooParam==null检查转化为等效的长javascript。问题是:有没有办法在vanilla javascript中使用这种语法,而不是使用CoffeeScript之外的库/翻译器/编译器?我们在项目中使用Traceur,但它没有这样的语法,因为它不符合ES6(尽管我希望如此)。也许某种方式在Traceur fork中实现它?

2 个答案:

答案 0 :(得分:4)

如果你不想要确切的CoffeeScript语义,你可以作弊:

return item.getFoo ? (item.getFoo().fooParam || {}).bar : undefined;

这里有一些技巧。

  1. 三元运算符用于测试item.getFoo
  2. 的真实性
  3. 如果fooParam缺失,假名或缺席,我们会用空对象替换它。 CoffeeScript会在这里得到保释。
  4. 我们返回bar的值,无论它是否存在。如果确实存在,则获得所需的值。如果它不存在但设置了fooParam,则会得到undefined。如果它不存在,因为fooParam未定义且我们回到{},您仍会获得undefined
  5. 如果三元运算符妨碍了你可以编写一些助手:

    function defaultObject(input) { // A helper to put somewhere
        return input || {};
    }
    
    return defaultObject((item.getFoo || defaultObject)().fooParam).bar;
    

    这更加棘手:defaultObject在使用{}调用时会返回getFoo,因此您不需要在函数调用周围使用三元运算符。如果fooParam不是真的,defaultObject将返回另一个空对象,从而无需另一个||。如果fooParam是真实的,defaultObject的行为与身份函数相似并将其返回。

    我确定这可以进一步打高尔夫球,但我建议避免使用这种模式。任何阅读你的代码的人都会相当困惑,并责怪你在代码库中乱七八糟。

答案 1 :(得分:1)

我最近有同样的问题,我来到这里希望有一个比现在更好的解决方案。如果你经常这样做,那么为你做一个函数会更容易:

var qm = function(arg) {
  if (arg instanceof Object) return arg;
  return function(){};
};

然后使用它,将对象包装在其中以确保不会引发错误。如果行上有许多 q uestion m arks,它会开始看起来很丑陋

qm(qm(item.getFoo)().fooParam).bar